概要

JOptionPaneにカウントダウンと自動クローズを行うためのJLabelを追加します。

サンプルコード

label.addHierarchyListener(new HierarchyListener() {
  private Timer timer = null;
  private AtomicInteger atomicDown = new AtomicInteger(SECONDS);
  @Override public void hierarchyChanged(HierarchyEvent e) {
    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;
        }
      }
    }
  }
});
View in GitHub: Java, Kotlin

解説

  • java.awt.event.HierarchyListener
  • javax.swing.Timer
    • 親のJOptionPaneが表示されてJLabel#isShowing()trueになったらTimer#start()でカウントダウンを開始
    • 指定した時間が経過したらWindow#dispose()メソッドを使用して親のJOptionPaneを自動的に閉じる
      • Window#dispose()を使用するのでJOptionPane.showConfirmDialog(...)の戻り値はJOptionPane.CLOSED_OPTIONになる

参考リンク

コメント