Мне нужно представить информационное сообщение, которое должно быть на экране в течение 5 секунд, за это время пользователь не может закрыть диалог. В спецификации четко указано, что в диалоговом окне не должно быть кнопки. Есть ли способ, которым я могу использовать JoptionPane.showMessageDialog таким образом, чтобы в диалоге не было кнопки?
JOptionPane без кнопки
Ответ 1
Как об этом, используя showOptionDialog
, может быть, не showMessageDialog
, но то же самое, когда у нас нет кнопок или места для ввода текста (падение может быть закрыто пользователем):
JOptionPane.showOptionDialog(null, "Hello","Empty?", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, new Object[]{}, null);
UPDATE
Вот еще один способ: он использует JOptionPane
и JDialog
(еще лучше, поскольку пользователь не закрыт):
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);
Ответ 2
Похоже, Дэвид придумал что-то, чтобы удовлетворить ваши требования "Нет кнопок".
Сказав это, похоже, вам, возможно, потребуется уточнить, каковы ваши настоящие требования. Действительно ли требуется, чтобы диалог был не закрыт, или что кнопка закрытия диалогового окна отсутствует? JOptionPane и JDialog имеют близкую кнопку, как стандартное окно.
Ответ 3
Я не думаю, что вы можете использовать JOptionPane, потому что, если я правильно помню, у них всегда есть хотя бы одна кнопка. Но вы можете использовать, например, брызговик, например 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() - это метод в вашем классе, который строит эту панель для ее уничтожения (установите ее в нуль или что-то еще), вам нужно создать этот кадр с помощью SwingUtilities.invokeLater(new TestFrame(this))
, если вы не хотите, чтобы остальная часть вашей графики заморозить.