如何强制JFrame为组件提供一定的空间?

时间:2012-11-13 10:11:46

标签: java jframe

public class n00767255 {
    public static void main(String[] args) {
        CarFrame frame = new CarFrame();
        frame.setSize(600,480);
        frame.setLocationRelativeTo(null);

        frame.setVisible(true);

        while(true)
        {
            frame.repaint();
        }   
    }
}

class CarFrame extends JFrame {
    CarFrame() {
        setLayout(new GridLayout(3,1));

        final CarPanel car1 = new CarPanel();
        car1.initCar(10,50,2,150,70,40);
        add(car1);

        final CarPanel car2 = new CarPanel();
        car2.initCar(10,50,2,150,70,40);
        add(car2);

        JButton startCar1 = new JButton("Start Car 1");

        JPanel panel = new JPanel();
        panel.setSize(600,40);
        panel.add(startCar1);

        add(panel);

        startCar1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(!car1.getMovingF())
                {
                    car1.modifyMovingF();
                }
            }
        });
    }
}

我想要做的是创建具有基本汽车形状的两个CarPanel,并且对于那些都是600X200并且间隔正确以便可以看到完整的对象。在那之下,我想用一堆不同的按钮来粘贴面板,这些按钮可以做不同的事情。在这里我的问题是汽车永远没有足够的空间可以完全看到,并且使用不同的布局管理器没有帮助。

修改

经过多次更改后,此代码无法正常运行。此时,第一辆车是唯一显示的车,并且起动车按钮位于车架的顶部。

3 个答案:

答案 0 :(得分:2)

看看frame.pack:http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#pack%28%29 - 它设置一个窗口的大小,使其符合其内容的首选大小。

如果框架的内容具有相关的设置首选大小,请调用

frame.pack();

而不是

frame.setSize(600,480);

在您的应用程序中 - 应该这样做。

编辑:您的代码的另一个问题是您可能使用了错误的布局管理器。 GridLayout创建一个常规网格,这意味着所有单元格都具有相同的大小。您应该尝试一种支持更灵活的单元格大小的布局,例如JGoodies FormLayout或MigLayout。

我已尝试使用以下CarPanel实现您的代码,GridLayout似乎忽略了它的子项的大小:

private class CarPanel extends JPanel {
    public CarPanel() {
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(600, 20);
    }
}

答案 1 :(得分:1)

尝试使用JFrame的pack method

public static void main(String[] args) {
    CarFrame frame = new CarFrame();
    frame.setPreferredSize(new Dimension(600,480));
    frame.setLocationRelativeTo(null);

    frame.pack();
    //...rest of code
  }
}

答案 2 :(得分:-1)

有关setSize setMinimumSize setMaximumSize和setPreferredSize

等方法,请参阅API