JDialog popup太小了

时间:2014-01-13 05:14:45

标签: java swing timer jdialog preferredsize

每次运行这段代码时,输​​出都是一个对话框,显示在屏幕的左上角,标题不显示。

有什么办法可以改变这个,以便对话框显示在中间且可接受的大小?

代码:

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");

}
}

JDialog only appears at the top right hand corner instead of center of screen

4 个答案:

答案 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);