我正在尝试制作一个简单的交通灯框架。这是由主框架 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 个基于 JPanel
的 TrafficLight
组件,并具有以下代码:
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 个圆圈,尽管大部分北(绿)灯和南(红)灯被切断。我认为这是因为北/南点比中心小得多。
我尝试使用 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/