有人可以帮我理解为什么我的自定义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);
}
}
最佳答案
您要在组件树中的几个不同位置添加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()
。(对同一组件事物的多个引用仍然适用)