web-dev-qa-db-ja.com

ボタンなしのJOptionPane

画面に5秒間表示する必要がある情報メッセージを表示する必要があります。この間、ユーザーはダイアログを閉じることができません。仕様では、ダイアログにボタンを含めるべきではないと明確に述べています。ダイアログにボタンがない方法でJoptionPane.showMessageDialogを使用する方法はありますか?

13
brevleq

showOptionDialogを使用するこの方法はどうですか、おそらくshowMessageDialogではありませんが、ボタンやテキストを入力する場所がない場合も同じです(ユーザーが閉じることができます)。

enter image description here

  JOptionPane.showOptionDialog(null, "Hello","Empty?", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, new Object[]{}, null);

[〜#〜] update [〜#〜]

これは別の方法です。JOptionPaneJDialogを使用します(ユーザーが閉じることができないため、さらに優れています)。

enter image description here

final JOptionPane optionPane = new JOptionPane("Hello world", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);

final JDialog dialog = new JDialog();
dialog.setTitle("Message");
dialog.setModal(true);

dialog.setContentPane(optionPane);

dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.pack();

//create timer to dispose of dialog after 5 seconds
Timer timer = new Timer(5000, new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        dialog.dispose();
    }
});
timer.setRepeats(false);//the timer should only go off once

//start timer to close JDialog as dialog modal we must start the timer before its visible
timer.start();

dialog.setVisible(true);
35
David Kroukamp

デビッドは「ボタンなし」の要件を満たすために何かを思いついたようです。

そうは言っても、実際の要件を明確にする必要があるようです。ダイアログを閉じることができないことが本当に必要ですか、それともダイアログを閉じるためのボタンがないのですか? JOptionPaneとJDialogには、標準ウィンドウのような閉じるボタンがあります。

1
Aaron Kurtzhals

上記のコードのいくつかを使用して、外部から呼び出す「メソッド」を作成しました。これにより、複数のポップアップが可能になります。私のバージョンでは、メッセージタイプ、タイトル、表示時間、画面配置、テキストを変更でき、テキストメッセージのフォントと色を変更する例が示されています。

/*
 * LabelDemo.Java contains a method that allow multiple popups. This version allows
 * changing the message type, title, display time, screen placement, text and
 * provides examples of changing the font and color of the text message.
 */ 

package components;

import Java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/*
 * LabelDemo.Java 
 * 
 */
public class LabelDemo {
   public LabelDemo() {
   }

   public static void main(String[] args) {
      TextDisplayPopup("1st popup", "<html><font size=11 color=blue>information type",
            6, 50, 105, JOptionPane.INFORMATION_MESSAGE);
      TextDisplayPopup("2nd popup", "<html><font size=15 color=red>ERROR TYPE\n"
            + "<html><font size=6 color=green>2nd line with long sentence for checking"
            + " popup box dynamic sizing.",
            10, 240, 240, JOptionPane.ERROR_MESSAGE);
   }

   public static void TextDisplayPopup(String strTitle, String strText,
         int iDelayInSeconds, int iX_Location, int iY_Location, int iMessageType) {
      final JOptionPane optionPane = new JOptionPane(strText,
            iMessageType, JOptionPane.DEFAULT_OPTION,
            null, new Object[]{}, null);
      final JDialog dialog = new JDialog();
      dialog.setTitle(strTitle);
      dialog.setModal(false);
      dialog.setContentPane(optionPane);
      dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
      dialog.pack();
      dialog.setLocation(iX_Location, iY_Location);

      //create timer to dispose of dialog after, iDelayInSeconds, seconds
      Timer timer = new Timer(iDelayInSeconds*1000, new AbstractAction() {
          @Override
          public void actionPerformed(ActionEvent ae) {
              dialog.dispose();
          }
      });
      timer.setRepeats(false);  //  one-time use timer

      //  timer removes dialog after iDelayInSeconds
      timer.start();
      dialog.setVisible(true);
      System.out.println("end of test");
   }
}

出力: 最初のポップアップ

2番目のポップアップ

0
MikeInPhoenix

JOptionPaneを使用できるとは思いません。覚えていれば、少なくとも1つのボタンが常にあるからです。ただし、たとえば this のようなスプラッシュパネルを使用することも、通常のパネルを使用してその中でスレッドを実行することもできます。お気に入り

_public class TestFrame extends JFrame implements Runnabel{

   private Thread thread;
   private CallerClass c; //Class which built this frame

   public TestPanel(CallerClass cc){
         this.c = cc;
         this.thread = null;
         //Window can't be closed on (x)
         this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
         //some things you put into your frame
         //...
         this.setVisible(true);
   }

   public synchronized void start(){
         if (thread == null){
         thread = new Thread(this);
     thread.start();
     }


    @Override
    public void run() {
          try{
              Thread.sleep(5000);
          }catch(InterruptedException e){ }

          this.setVisible(false);
          this.c.destroyFrame();

          this.stop();
     }
 }
_

DestroyFrame()が、このパネルを構築して破棄する(nullなどに設定する)クラス内のメソッドである場合、残りの部分が必要ない場合は、SwingUtilities.invokeLater(new TestFrame(this))を使用してこのフレームを作成する必要があります。フリーズするグラフィック。

0
Alex VII