2
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,并且间隔适当,以便可以看到完整的对象。在此之下,我想用一堆不同的按钮来粘贴面板,这些按钮可以做不同的事情。在这里我的问题是汽车永远没有足够的空间可以完全看到,并且使用不同的布局管理器也没有帮助。

编辑

经过多次更改后,此代码根本无法按我预期的方式工作。此时第一辆车是唯一显示的车,启动车按钮位于框架的顶部。

4

3 回答 3

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);
    }
}
于 2012-11-13T10:15:16.310 回答
1

尝试使用 JFrame 的打包方法

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

    frame.pack();
    //...rest of code
  }
}
于 2012-11-13T10:15:49.767 回答
-1

有关setSize setMinimumSize setMaximumSize 和 setPreferredSize 等方法,请参阅API

于 2012-11-13T10:15:27.370 回答