有人可以帮我理解为什么我的自定义JComponent'Bar'只在直接添加到JFrame时显示,而不是在添加到JPanel(然后添加到JFrame)时显示?
谢谢!
package main;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Board {
public void start(){
JFrame frame = new JFrame();
JButton button1 = new JButton("Button 1");
Bar statusbar = new Bar();
JLabel status = new JLabel("Status: ");
JPanel topPanel = new JPanel();
topPanel.add(status);
topPanel.add(statusbar);
JPanel mainPanel = new JPanel();
mainPanel.add(button1);
mainPanel.add(statusbar);
frame.getContentPane().add(BorderLayout.NORTH, topPanel);
frame.getContentPane().add(BorderLayout.SOUTH, mainPanel);
frame.getContentPane().add(BorderLayout.CENTER, statusbar);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,100);
frame.setVisible(true);
}
}
这是我的酒吧课......
package main;
import java.awt.Graphics;
import javax.swing.JComponent;
public class Bar extends JComponent{
public void paint(Graphics g){
g.fillRect(0, 0, 100, 10);
}
}
答案 0 :(得分:3)
您正在将statusbar
添加到组件树中的几个不同位置,Swing并未妥善处理(或者根本没有)。
每次使用时都创建一个单独的Bar
个实例,如果你想让它们的显示同步,它们应该共享相同的模型。
啊,乍一看,问题在于你从未为Bar
组件设置大小(或首选大小),因此布局管理器会将它们压缩为0。
尝试:
public static class Bar extends JComponent {
private Bar() {
setPreferredSize(new Dimension(25, 5));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect(0, 0, 100, 10);
}
}
您还应该在显示之前添加frame.pack()
。
(对同一组件事物的多次引用也是如此)
答案 1 :(得分:3)
自定义组件的维度为(0, 0)
。
当添加到具有BorderLayout
布局管理器的容器时,它将展开以填充可用空间,因此变为可见。
当添加到具有FlowLayout
布局管理器的容器时,它将不会展开,而是保持其首选大小(即(0, 0)
)。因此,虽然它仍然存在,但不会变得可见。
这解释了为什么自定义组件仅在直接添加到JFrame
时显示,因为它使用BorderLayout
布局管理器,而JPanel
使用FlowLayout
布局管理器。