«Есть ли способ, что я могу изменить это так, что появится диалоговое окно, в середине и приемлемого размера?»
Если вы просто добавить компоненты к нему, упаковать его и установить его местоположение относительно нулевой, он должен работать нормально
Предпочтительно .pack()
вместо установки размера. Чтобы пакет работал, вам необходимо добавить компоненты. .pack()
будет делать то же, что и его название, - упакуйте фрейм с учетом всех предпочтительных размеров добавленных компонентов.
Также с помощью setLocationRelativeTo()
вы устанавливаете диалог относительно компонента. Если вы используете null
, он всегда будет центрироваться на экране. Но если вы установите местоположение относительно его родителя, то он будет центрироваться по кадру.
Я совершенно не знаю, что вы пытаетесь достичь с помощью таймера, так что я просто предпочитаю не-комментария
См пример
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
final MyDialog dialog = new MyDialog(f, "Title", true);
Timer timer = new Timer(10000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
dialog.dispose();
}
});
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
System.out.println("Dialog closed");
}
private static class MyDialog extends JDialog {
public MyDialog(JFrame frame, String title, boolean modal) {
super(frame, title, modal);
setLayout(new BorderLayout());
add(new JButton("NORTH"), BorderLayout.NORTH);
add(new JButton("SOUTH"), BorderLayout.SOUTH);
add(new JButton("EAST"), BorderLayout.EAST);
add(new JButton("WEST"), BorderLayout.WEST);
add(new JButton("CENTER"), BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
}
}
}
В качестве примечания , вы должны запускать приложения Swing из Event Dispatch Thread (EDT), как это
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run() {
// the code from your main method here
}
});
}
или ['SwingUtilities.invokeLater'] (http://stackoverflow.com/questions/8847083/swingutilities-invokelater-vs-eventqueue-invokelater). – Justin