Swing JFrame,JDialog位置有奇怪的填充

时间:2016-08-24 17:50:08

标签: java swing jframe padding jdialog

我有一个主JFrame(1),之后我想在下面放一个JDialog(2)(相同的左边框位置):

  

dialog2.setLocation(frame.getX(),frame.getY()+ frame.getHeight());

并将另一个JDialog(3)放在右边(相同的顶部边框位置):

  

dialog3.setLocation(frame.getX()+ frame.getWidth(),frame.getY());

但是这些画面和显示屏之间有一些奇怪的填充物。对话框:

enter image description here

测试代码:

public class Test {
    public static void main(String[] args) throws Exception {
        JFrame mainFrame = new JFrame();
        mainFrame.setSize(400, 400);
        mainFrame.setVisible(true);

        JFrame dialog = new JFrame(); // JDialog dialog = new JDialog();
        dialog.setSize(400, 400);
        dialog.setLocation(mainFrame.getX() + mainFrame.getWidth(), mainFrame.getY());
        dialog.setVisible(true);

        JFrame dialog1 = new JFrame(); // JDialog dialog1 = new JDialog();
        dialog1.setSize(400, 400);
        dialog1.setVisible(true);
        dialog1.setLocation(mainFrame.getX(), mainFrame.getY() + mainFrame.getHeight());
    }
}

任何人都可以解释为什么和建议解决方案,使这些更接近,没有任何填充?

2 个答案:

答案 0 :(得分:2)

为什么不使用JFrame来代替使用多个JPanel

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    frame.getContentPane().setLayout(new BorderLayout());

    JPanel sidePanel = new JPanel(new BorderLayout());

    JPanel buttonPanel = new JPanel(new GridLayout(0,3));
    for(int i = 0; i < 6; i++) {
        JButton button = new JButton("Button " + (i+1));
        button.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
        buttonPanel.add(button);
    }
    buttonPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

    JTextArea log = new JTextArea();
    for(int i = 0; i < 50; i++) {
        log.setText(log.getText() + "line " + (i+1) + "\n");
    }

    sidePanel.add(new JScrollPane(log), BorderLayout.CENTER);
    sidePanel.add(buttonPanel, BorderLayout.NORTH);

    JPanel browserPanel = new JPanel(new GridLayout());

    // code for browser

    frame.getContentPane().add(browserPanel, BorderLayout.CENTER);
    frame.getContentPane().add(sidePanel, BorderLayout.WEST);

    frame.setVisible(true);

这就是它最终看起来像:

cat

答案 1 :(得分:0)

尝试使用框架上的getLocationOnScreen()代替getX和getY