每次运行这段代码时,输出都是一个对话框,显示在屏幕的左上角,标题不显示。
有什么办法可以改变这个,以便对话框显示在中间且可接受的大小?
代码:
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
final JDialog dialog = new JDialog(f, "Hello world", 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");
}
}
答案 0 :(得分:3)
绝对。默认情况下,JDialog
(或JFrame
)会出现。你需要在它上面设置界限:
dialog.setBounds(xPosition, yPosition, width, height);
但是,如果你只为它设置一些幻数,这将无法很好地扩展到其他系统。相反,获取屏幕尺寸,然后设置:
//static and final because no reason not to be. Insert this at the class definition
static final Dimension SCREEN_DIMENSION = Toolkit.getDefaultToolkit().getScreenSize();
...
//I'd also make this static and final and insert them at the class definition
int dialogWidth = SCREEN_DIMENSION.width / 4; //example; a quarter of the screen size
int dialogHeight = SCREEN_DIMENSION.height / 4; //example
...
int dialogX = SCREEN_DIMENSION.width / 2 - dialogWidth / 2; //position right in the middle of the screen
int dialogY = SCREEN_DIMESNION.height / 2 - dialogHeight / 2;
dialog.setBounds(dialogX, dialogY, dialogWidth, dialogHeight);
或者,如果您向JDialog
添加组件,请致电
dialog.pack();
对话框现在是容纳组件的最小尺寸。如果您使用的是紧密包装的组件,请使用此方法;那么你不必手工精心构造正确的宽度和高度。
答案 1 :(得分:2)
“有什么方法可以改变这个,以便对话框显示在中间且可接受的大小?”
如果你只是添加组件,打包它,并设置相对于null的位置,它应该工作正常
首选.pack()
而不是设置尺寸。要使包工作,您需要实际添加组件。 .pack()
将完全按照其名称建议执行 - 根据所有添加的组件的首选大小打包框架。
同样使用setLocationRelativeTo()
设置相对于组件的对话框。如果您使用null
,它将始终以屏幕为中心。但是,如果您设置相对于其父级框架的位置,它将显示在框架的中心位置。
我完全不知道你想用计时器实现什么,所以我更喜欢 no-comment
参见示例
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);
}
}
}
作为旁注,您应该像这样从事件调度线程(EDT)运行Swing应用程序
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run() {
// the code from your main method here
}
});
}
答案 2 :(得分:1)
在timer.start();
和dialog.setVisible(true);
语句之间添加以下代码行 -
timer.start();
dialog.setPreferredSize(new Dimension(50, 150));//set your desired size
dialog.pack();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
int iWidth = (screenSize.width - dialog.getWidth()) / 2;
int iHeight = (screenSize.height - dialog.getHeight()) / 2;
dialog.setLocation(iWidth, iHeight);
dialog.setVisible(true);
此代码会将对话框设置为屏幕的中心。
答案 3 :(得分:0)
添加此行
dialog.setBounds(0, 0, 1000, 500);