「有什麼辦法,我可以改變這種做法,在出現的對話框在中間和可接受的大小?」
如果你只需要添加組件到它,包裝它,而相對於空位置設置它,它應該工作正常
優選將.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);
}
}
}
作爲一個側面說明,你應該像這樣運行來自Event Dispatch Thread(EDT)的Swing應用程序
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