我有一个非常简单的自定义组件。它的首选和最大尺寸为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);
我不确定我错过了什么。谢谢
我有一个非常简单的自定义组件。
自定义组件负责确定其:
- 最小尺寸
- 首选尺寸
- 最大尺寸
您只实现首选和最大大小。
但组件为什么没有居中并且是最大宽度的一半仍然没有意义。
BoxLayout试图尊重组件的最小和最大大小。
默认的最小大小是(0,0(,这似乎会引起BoxLayout的混乱。我不知道为什么。我认为这是BoxLayout的一个缺陷/功能。
您需要实现getMinimumSize()
方法。这似乎奏效了:
@Override
public Dimension getMinimumSize() {
return new Dimension(2, 2);
}
注意,我尝试过(1,1(,但没有成功。再说一遍,不知道为什么。
我建议,对于您的情况,您可能想使用:
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
对于minimum和maximum方法,因为看起来您希望大小保持不变。
重写方法getAnyKindOfSize()
通常不是一个好的做法。尝试将组件添加到使用FlowLayout
的嵌套JPanel
中,然后将此JPanel
添加到BoxLayout
ed面板中。类似这样的东西:
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
}
}