java - 使 BorderLayout 中的项目占据正确的大小

标签 java swing layout-manager border-layout

我正在尝试制作一个简单的交通灯框架。这是由主框架 TrafficBox 制作的:

public class TrafficBox extends JFrame {

public TrafficBox() {
    setLayout(new BorderLayout(100,100));
    add(new TrafficLight(Color.GREEN), BorderLayout.NORTH);
    add(new TrafficLight(Color.ORANGE), BorderLayout.CENTER);
    add(new TrafficLight(Color.RED), BorderLayout.SOUTH);
    setBounds(100, 100, 800, 600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new TrafficBox();
        }
    });

}

如图所示,添加了 3 个基于 JPanelTrafficLight 组件,并具有以下代码:

public class TrafficLight extends JPanel {

private final int BALL_DIAMETER = 100;
private Color color;

public TrafficLight(Color color) {
    //setSize(BALL_DIAMETER, BALL_DIAMETER);
    this.color = color;
    new Timer(1000, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            repaint();
        }
    }).start();
}

public void paintComponent(Graphics g) {
    g.setColor(color);
    g.fillOval(0, 0, BALL_DIAMETER, BALL_DIAMETER);
}

这确实是我想要的,它按预期绘制了所有 3 个圆圈,尽管大部分北(绿)灯和南(红)灯被切断。我认为这是因为北/南点比中心小得多。

enter image description here

我尝试使用 setSize(); 将面板的大小设置为圆圈的大小,但这不起作用。有没有办法让整个圆圈可见?

最佳答案

因此,大多数布局管理器都需要组件提供一些“提示”,以便了解它们想要如何布局。

您需要覆盖 getPreferredSize 并返回最能满足您需求的尺寸,例如...

public class TrafficLight extends JPanel {

    private final int BALL_DIAMETER = 100;

    //...

    public Dimension getPreferredSize() {
        return new Dimension(BALL_DIAMETER, BALL_DIAMETER);
    }    

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent();
        g.setColor(color);
        g.fillOval(0, 0, BALL_DIAMETER, BALL_DIAMETER);
    }

此外,paintComponent 不需要是public,其他人不应该调用它,您应该调用 super.paintComponent() 在执行任何自定义绘画之前。

我还建议使用 GridLayout 来实现此目的

我还认为 TrafficLight 不需要它自己的 Timer 并且应该由外部控制,但这就是我

setBounds(100, 100, 800, 600);

最好避免使用 pack() 将窗口调整为内容的首选大小,并使用 setLocation 对其进行定位

关于java - 使 BorderLayout 中的项目占据正确的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52980806/

相关文章:

java - GridBagLayout对齐和Button样式

java - "exposing"API 的本质是什么,特别是在 Google Cloud Endpoint 中?

java - Eclipse 代码格式化程序缺少规则

java - 如何获得正确的 JTable 宽度?

java - 如何在 JMenuItem 上调用 dispose()?

java - 将组件放置在 JTabbedPane 中选项卡的右侧

java - spring-mvc 应用程序的模板和布局

java - 如何在按钮中容纳长文本?

java - 选项卡的组件未显示

java - Box Layout 移动组件、对齐