Swing/AutomaticallyCloseDialog のバックアップ差分(No.11)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/AutomaticallyCloseDialog へ行く。
- 1 (2013-09-06 (金) 12:43:30)
- 2 (2013-09-06 (金) 15:58:55)
- 3 (2014-05-31 (土) 21:42:59)
- 4 (2014-10-28 (火) 03:15:21)
- 5 (2015-01-09 (金) 12:08:38)
- 6 (2016-04-21 (木) 15:31:42)
- 7 (2017-02-10 (金) 15:00:02)
- 8 (2017-04-07 (金) 13:51:51)
- 9 (2017-12-24 (日) 15:18:23)
- 10 (2018-02-05 (月) 19:10:58)
- 11 (2020-01-31 (金) 15:05:47)
- 12 (2021-07-25 (日) 23:20:46)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: AutomaticallyCloseDialog title: JOptionPaneを自動的に閉じる tags: [JOptionPane, Timer, HierarchyListener, JLabel] author: aterai pubdate: 2013-09-02T00:27:47+09:00 description: JOptionPaneにカウントダウンと自動クローズを行うためのJLabelを追加します。 image: https://lh6.googleusercontent.com/-NvrpIdRXy8M/UiMOJmS8OMI/AAAAAAAABzg/6QK49B0s-NE/s800/AutomaticallyCloseDialog.png --- * 概要 [#summary] `JOptionPane`にカウントダウンと自動クローズを行うための`JLabel`を追加します。 #download(https://lh6.googleusercontent.com/-NvrpIdRXy8M/UiMOJmS8OMI/AAAAAAAABzg/6QK49B0s-NE/s800/AutomaticallyCloseDialog.png) * サンプルコード [#sourcecode] #code(link){{ label.addHierarchyListener(new HierarchyListener() { private Timer timer = null; private AtomicInteger atomicDown = new AtomicInteger(SECONDS); @Override public void hierarchyChanged(HierarchyEvent e) { final JLabel l = (JLabel) e.getComponent(); if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) { if (l.isShowing()) { textArea.append("isShowing=true\n"); atomicDown.set(SECONDS); l.setText(String.format("Closing in %d seconds", SECONDS)); timer = new Timer(1000, new ActionListener() { //private int countdown = SECONDS; @Override public void actionPerformed(ActionEvent e) { //int i = --countdown; int i = atomicDown.decrementAndGet(); l.setText(String.format("Closing in %d seconds", i)); if (i <= 0) { Window w = SwingUtilities.getWindowAncestor(l); if (w != null && timer != null && timer.isRunning()) { textArea.append("Timer: timer.stop()\n"); timer.stop(); textArea.append("window.dispose()\n"); w.dispose(); } } } }); timer.start(); } else { textArea.append("isShowing=false\n"); if (timer != null && timer.isRunning()) { textArea.append("timer.stop()\n"); timer.stop(); timer = null; } } } } }); }} * 解説 [#explanation] - `java.awt.event.HierarchyListener` -- `HierarchyListener`を使って、`JLabel`の表示状態の変化を監視 --- [[JOptionPaneのデフォルトフォーカス>Swing/OptionPaneDefaultFocus]] - `javax.swing.Timer` -- 親の`JOptionPane`が表示されて`JLabel#isShowing()`が`true`になったら、`Timer#start()`でカウントダウンを開始 --- [[JComponentの表示状態>Swing/ShowingDisplayableVisible]] -- 指定した時間が経過したら、`Window#dispose()`を使って、親の`JOptionPane`を自動的に閉じる --- `Window#dispose()`を使うので、`JOptionPane.showConfirmDialog(...)`の戻り値は、`JOptionPane.CLOSED_OPTION`になる -- 指定した時間が経過したら`Window#dispose()`メソッドを使用して、親の`JOptionPane`を自動的に閉じる --- `Window#dispose()`を使うので、`JOptionPane.showConfirmDialog(...)`の戻り値は`JOptionPane.CLOSED_OPTION`になる * 参考リンク [#reference] - [[JComponentの表示状態>Swing/ShowingDisplayableVisible]] - [[JOptionPaneのデフォルトフォーカス>Swing/OptionPaneDefaultFocus]] - [https://stackoverflow.com/questions/10021969/java-how-to-continuously-update-jlabel-which-uses-atomicinteger-to-countdown-af swing - Java: How to continuously update JLabel which uses atomicInteger to countdown after ActionListener - Stack Overflow] * コメント [#comment] #comment #comment