Swing/WaitCursor のバックアップ(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/WaitCursor へ行く。
- 1 (2007-05-07 (月) 13:57:16)
- 2 (2007-07-03 (火) 16:38:28)
- 3 (2007-07-03 (火) 19:06:04)
- 4 (2007-07-08 (日) 05:51:50)
- 5 (2007-08-27 (月) 19:24:15)
- 6 (2008-04-15 (火) 16:58:10)
- 7 (2008-04-25 (金) 20:55:09)
- 8 (2008-11-10 (月) 20:33:08)
- 9 (2011-03-18 (金) 19:09:12)
- 10 (2011-03-26 (土) 23:15:00)
- 11 (2011-08-25 (木) 18:33:32)
- 12 (2011-10-10 (月) 19:22:06)
- 13 (2013-04-10 (水) 02:37:38)
- 14 (2013-07-26 (金) 01:31:36)
- 15 (2013-08-18 (日) 04:30:36)
- 16 (2013-08-20 (火) 14:27:40)
- 17 (2013-08-21 (水) 20:51:02)
- 18 (2013-09-07 (土) 00:27:58)
- 19 (2014-01-14 (火) 08:32:09)
- 20 (2014-01-14 (火) 14:13:39)
- 21 (2014-09-18 (木) 02:32:07)
- 22 (2014-10-25 (土) 23:45:44)
- 23 (2014-11-18 (火) 19:16:27)
- 24 (2014-11-25 (火) 03:03:31)
- 25 (2015-10-09 (金) 16:32:32)
- 26 (2016-02-06 (土) 18:18:27)
- 27 (2016-06-03 (金) 13:27:52)
- 28 (2016-08-18 (木) 15:12:02)
- 29 (2017-08-23 (水) 18:43:57)
- 30 (2017-11-02 (木) 15:32:16)
- 31 (2018-06-27 (水) 19:29:34)
- 32 (2018-08-24 (金) 15:07:25)
- 33 (2018-10-14 (日) 16:36:06)
- 34 (2018-10-20 (土) 19:05:14)
- 35 (2020-10-18 (日) 18:44:07)
- 36 (2022-08-12 (金) 00:59:10)
- 37 (2024-02-05 (月) 15:47:59)
- 38 (2025-01-03 (金) 08:57:02)
- 39 (2025-01-03 (金) 09:01:23)
- 40 (2025-01-03 (金) 09:02:38)
- 41 (2025-01-03 (金) 09:03:21)
- 42 (2025-01-03 (金) 09:04:02)
- 43 (2025-06-19 (木) 12:41:37)
- 44 (2025-06-19 (木) 12:43:47)
TITLE:Cursorを砂時計に変更
Posted by aterai at 2004-06-07
Cursorを砂時計に変更
処理中、マウスカーソルを砂時計に変更します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
frame.setGlassPane(new LockingGlassPane());
frame.getGlassPane().setVisible(false);
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
frame.getGlassPane().setVisible(true);
button.setEnabled(false);
new SwingWorker() {
@Override public Object doInBackground() {
dummyLongTask();
return "Done";
}
@Override public void done() {
frame.getGlassPane().setVisible(false);
button.setEnabled(true);
}
}.execute();
}
});
View in GitHub: Java, Kotlinclass LockingGlassPane extends JComponent {
public LockingGlassPane() {
setOpaque(false);
setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
@Override public boolean accept(Component c) {return false;}
});
addKeyListener(new KeyAdapter() {});
addMouseListener(new MouseAdapter() {});
requestFocusInWindow();
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
@Override public void setVisible(boolean flag) {
super.setVisible(flag);
setFocusTraversalPolicyProvider(flag);
}
}
解説
上記のサンプルでは、カーソルを砂時計に変更し、なにもしないマウスリスナーなどを設定した`GlassPane
を
JFrame#setGlassPane()
`メソッドでフレームに追加しています。
スタートボタンがクリックされて処理が継続している間は、この`GlassPane
`が有効になり、マウス、キー、フォーカス移動などのイベントが、すべてGlassPaneに奪われるため、フレーム内のコンポーネントをアクセス不可にすることが出来ます。
このため、サンプルにある`setEnabled(true)
な
JTextField
`の上にマウスポインタを移動しても、処理中はカーソルアイコンは砂時計のまま変化しません。
TABキーなどによるフォーカス移動を禁止する場合は、`GlassPane
`に以下のような設定を行います。
- どのコンポーネントにもフォーカス移動できない`
FocusTraversalPolicy
`を設定する
setFocusTraversalPolicy(new DefaultFocusTraversalPolicy() {
@Override public boolean accept(Component c) {return false;}
});
- または、`
TraversalKeys
`を空にする
Set<AWTKeyStroke> s = Collections.emptySet();
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, s);
setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, s);
`Mnemonic
なども禁止したい場合は、以下のような
GlassPane
`を使用する方法があります(参考:Disabling Swing Containers, the final solution?)。
class LockingGlassPane extends JComponent {
public LockingGlassPane() {
setOpaque(false);
super.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
@Override public void setVisible(boolean isVisible) {
boolean oldVisible = isVisible();
super.setVisible(isVisible);
JRootPane rootPane = SwingUtilities.getRootPane(this);
if(rootPane!=null && isVisible()!=oldVisible) {
rootPane.getLayeredPane().setVisible(!isVisible);
}
}
@Override public void paintComponent(Graphics g) {
JRootPane rootPane = SwingUtilities.getRootPane(this);
if(rootPane!=null) {
// http://weblogs.java.net/blog/alexfromsun/archive/2008/01/
// it is important to call print() instead of paint() here
// because print() doesn't affect the frame's double buffer
rootPane.getLayeredPane().print(g);
}
super.paintComponent(g);
}
}
`JDK 1.6.0
`の場合、Disabled Glass Pane « Java Tips Weblogのようにキー入力を無効にするキーリスナーを追加する方法もあります。
この方法は、`JDK 1.5.0
などの場合、
WindowsLookAndFeel
`で、Altキーを押すとメニューバーにフォーカスが移ることがあります。
`JDK 1.7.0
の場合、
JLayer
`などを使用することで、特定のコンポーネントだけ入力不可にしてカーソルを砂時計にするといった設定が簡単に出来るようになっています。
参考リンク
- Swing - How to display "Loading data..." to the user
- Disabling Swing Containers, the final solution?
- Disabled Glass Pane « Java Tips Weblog
コメント
- TABキーで状態遷移しないようにするため、なにもしない`
FocusTraversalPolicy
`を追加しました。 -- aterai - 相当悩みました。`
JDialog
`だと同じことができないのは何でなんでしょうねぇ。。。 -- おれ?- カーソルが変わらないのでしょうか? それともコンパイルエラーが出るとかでしょうか? -- aterai
- 申し訳ない。カーソルが変わらないのだけれど、`
1.5
系でコンパイルするとだめみたい。同じソースでも
1.4
系でコンパイルするとちゃんと変わる。
1.5
`でのバグかな。。。 -- おれ? - `
DefaultFocusTraversalPolicy
`を使うように変更しました。 -- aterai - `
GlassPane
で、
FocusTraversalPolicy
を使わず、
print
を使って
Mnemonic
`などをブロックするように変更しました。 -- aterai - `
SwingWorker
`を使うように変更。 -- aterai