2012-01-12 22 views
5

サイズ変更可能なヘッダー列を持つアプリケーションにJTableがあります。通常、サイズ変更のためにカーソルをテーブルヘッダーに移動すると、カーソルアイコンは< - >のようなサイズ変更の矢印に変わります。setCursorメソッドをトリガーした後にカーソルアイコンが変わらない

ただし、次のような状況では状況が異なります。

Frameにボタンアクションがあり、実行中にカーソルをビジーアイコンに設定し、操作が完了したらContainer.setCurosr(Cursor cursor)メソッドを使用してデフォルトカーソルに戻します。

サイズ変更の表ヘッダーにカーソルを移動すると、ボタン操作後にカーソルアイコンがサイズ変更の矢印に変更されず、カーソルがまったく変更されないことがあります。

これはJava Swingのバグと見なすことができますか、この問題の解決方法はありますか?

更新:サンプルコードでは、ボタンを数回

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class ColumnResizeIconTest extends JFrame { 

JScrollPane scrollPane; 
JTable table; 
JButton button; 

public ColumnResizeIconTest() { 
    setLayout(new BorderLayout()); 
    addComponents(); 
    setSize(300,300); 
} 

private void addComponents() { 
    addButton(); 
    addTable(); 
} 

private void addButton() { 
    button = new JButton("Click Me"); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      setWaitCursor(); 
      for(int i=0; i<2000; i++) { 
       System.out.print(i); 
      } 
      setDefaultCursor(); 
     } 
    }); 
    add(button, BorderLayout.NORTH); 
} 

private void addTable() { 
    scrollPane = new JScrollPane(createTable()); 
    add(scrollPane, BorderLayout.CENTER); 
} 

private JTable createTable() { 
    Object[][] cellData = { { "1-1", "1-2","1-3" }, { "2-1", "2-2", "2-3" }, { "3-1", "3-2", "3-3" } }; 
    String[] columnNames = { "column1", "column2", "column3" }; 
    table = new JTable(cellData, columnNames); 
    return table; 
} 

private void setWaitCursor() { 
    Container container = getContentPane(); 
    setWaitCursor(container); 
} 

private void setWaitCursor(Container container) { 
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) { 
     Component child = (Component) container.getComponent(iCount); 
     if(child instanceof Container) { 
      setWaitCursor((Container) child); 
     } else { 
      child.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
     } 
    } 
    container.setCursor(new Cursor(Cursor.WAIT_CURSOR)); 
} 

private void setDefaultCursor() { 
    Container container = getContentPane(); 
    setDefaultCursor(container); 
} 

private void setDefaultCursor(Container container) { 
    for(int iCount = 0; iCount < container.getComponentCount(); iCount++) { 
     Component child = (Component) container.getComponent(iCount); 
     if(child instanceof Container) { 
      setDefaultCursor((Container) child); 
     } else { 
      child.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 
    container.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
} 

public static void main(String[] argv) throws Exception { 
    ColumnResizeIconTest test = new ColumnResizeIconTest(); 
    test.setVisible(true); 
} 
} 

クリックを添付して、テーブルの列のサイズを変更してみてください。カーソルがデフォルトカーソルで止まっています。

+0

どのプラットフォームでどのバージョンのJavaを使用しますか? –

+2

1)より良いヘルプを早急に入手するには、[SSCCE](http://sscce.org/)を投稿してください。 2)* "これはバグと見なすことができますか?" *おそらく。 * ".. Java Swing .." *おそらくそうではありません。 * "..またはこの問題の解決方法はありますか?" *あなたのコードを修正しました(おそらく)。 –

+1

@Andrew Thompson今日はどれくらいでしょうか?おそらくあなたの3からおそらく4と合意しました。 – mKorbel

答えて

8

既に言及したように:それは全く些細なことではありませんすべてのコンポーネントがの場合はにデフォルトのカーソルがあるという基本的な問題があります(再帰カーソル設定では待ちます)。

テーブルの見出しにあるように、その前提は正しくありません。そのコンポーネントでは、マウスの位置に応じてdefaultCursorまたはresizeCursorのいずれかがデフォルトになります。さらに、内部カーソルの切り替えはそれほど賢明ではありません:状態をチェックしません(頭の上からその事実が少し前に襲ってきました:-)

あなたが到達したいことは不明ですが、再帰的な設定を完全に削除することを除いて、具体的な解決策はありません。オプションは、(フレームのrootPaneにする)のglassPaneを可視にし、より小さな面積でそれ

  • 使用JLayer(JDK7)またはJXLayer(JDK6)にwaitCursorを設定し、その
  • にwaitCursorを設定

    • かもしれません
    • は、あまり侵入しない視覚化を使用し、fi

      問題:-) @mKorbelためJProgressBarのどこかJXBusyLabel(in the SwingX project

    補遺は(そのために(感謝のOPS SSCCEにほとんど変化して、簡単に再現可能であり):!変更次のようなaddButtonメソッドを使用してボタンをクリックし、待機カーソルが表示されている間、マウスをヘッダーに移動し、次に別の列(列の境界線を越えて)に移動します。このように複数回実行すると、ヘッダーに予期しないカーソルが表示されます。

    private void addButton() { 
        button = new JButton("Click Me"); 
        final ActionListener off = new ActionListener() { 
    
         @Override 
         public void actionPerformed(ActionEvent e) { 
          setDefaultCursor(); 
          button.setEnabled(true); 
         } 
    
        }; 
        button.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent ae) { 
          setWaitCursor(); 
          button.setEnabled(false); 
          Timer timer = new Timer(2000, off); 
          timer.setRepeats(false); 
          timer.start(); 
         } 
        }); 
    
        add(button, BorderLayout.NORTH); 
    } 
    
    +0

    まで、私はFRI第13号が明日であることを確信しました。これはEDT関連の問題ですが正しくremmemberすれば私はsimilairの質問これについては、このプロセスを2つの分離したアクションに分割する必要があります。そうでなければ、ネイティブOSから来たオブジェクトのイベントの注文を保証するものではありません。 – mKorbel

    +0

    +1と忘れてしまった+1 – mKorbel

    +0

    @mKorbel EDT違反は、自然な犯人 - 今度は、それは単に不完全なロジックです:-) – kleopatra

    1

    1)あなたが復元しなければならない)、例えばhere

    2、あなたがjavax.swing.TimerSwingWorke Rを実装、またはRunnable#Thread内部これらのコード行をラップすることができ、バックグラウンドタスクにコードを

    for(int i=0; i<2000; i++) { 
        System.out.print(i); 
    } 
    

    リダイレクト有しますCursor on Error/Exceptionでも、それはおそらくCursorが変更されなかった理由です。

    +0

    あなたは私の問題を正しく理解していたのを恐れています。私がボタンをクリックする前に、テーブルの列ヘッダーの間にカーソルを置くと、カーソルは<->になります。ボタンをクリックすると、実行されたアクション内でカーソルが砂時計に変わり、アクションが開始されます。アクションが終了すると、カーソルはデフォルトのカーソルに変更され、アクションが実行されたままになります。その後、私はテーブルのヘッダーの列のギャップにカーソルを置く場合、アイコンは<->ではなく、デフォルトのアイコンです。これは、ボタンを数回クリックすると発生します。しかし、私はまだ列のサイズを変更することができます。 – AnupD

    +0

    あなたの問題を生成することができない、またJButtonを何度もプッシュした場合、CursorをJFrame、JButton、JTableにリダイレクトし、Cursorでこの問題を突き止めることができます。最終的にブロックし、そこにCursor.WAIT_CURSOR、ええと永遠に滞在 – mKorbel

    +0

    うーん..私は例外部分を持っていますが、ここではそうではありません。問題のビデオやスクリーンショットをあなたと共有することができれば幸いです。 – AnupD

    関連する問題