• title: JOptionPaneを自動的に閉じる tags: [JOptionPane, Timer, HierarchyListener, JLabel] author: aterai pubdate: 2013-09-02T00:27:47+09:00 description: JOptionPaneにカウントダウンと自動クローズを行うためのJLabelを追加します。

概要

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

サンプルコード

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;
        }
      }
    }
  }
});
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント