我有一个非常简单的自定义组件。它的首选最大尺寸为100x100,只是一个红色矩形。我将其添加到使用框布局的JPanel中。我希望自定义组件的大小为100x100,但实际上是50x100(始终是最大宽度的一半)。
这里是代码:
public class Testing extends JFrame {
class TestComponent extends JComponent {
@Override
public Dimension getMaximumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(Color.RED);
g2d.fillRect(getX(), getY(), getWidth(), getHeight());
System.out.println(getWidth());
}
}
private JPanel panel;
private TestComponent testComponent;
public Testing() {
super("Testing");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(1280, 720);
setLocationRelativeTo(null);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.setBackground(Color.CYAN);
testComponent = new TestComponent();
panel.add(testComponent);
add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
new Testing().setVisible(true);
});
}
}
如果不是我的自定义组件而是添加了设置了首选大小和最大大小的JPanel,则不会发生这种情况。
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.setBackground(Color.CYAN);
// testComponent = new TestComponent();
// panel.add(testComponent);
JPanel test = new JPanel();
test.setPreferredSize(new Dimension(100,100));
test.setMaximumSize(new Dimension(100,100));
test.setBackground(Color.RED);
panel.add(test);
add(panel);
我不确定我缺少什么。谢谢!
覆盖方法getAnyKindOfSize()
通常不是一个好习惯。尝试将组件添加到使用JPanel
的嵌套FlowLayout
内,然后将此JPanel
添加到BoxLayout
版本的面板中。像这样的东西:
testComponent = new TestComponent();
testComponent.setPreferredSize(new Dimension(100, 100));
JPanel flowPanel = new JPanel(new FlowLayout());
flowPanel.add(testComponent);
panel.add(flowPanel);
和:
class TestComponent extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(Color.RED);
g2d.fillRect(0, 0, getWidth(), getHeight()); //Notice x, y
}
}