BoxLayout为自定义组件提供了意外的宽度



我有一个非常简单的自定义组件。它的首选和最大尺寸为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);

我不确定我错过了什么。谢谢

我有一个非常简单的自定义组件。

自定义组件负责确定其:

  1. 最小尺寸
  2. 首选尺寸
  3. 最大尺寸

您只实现首选和最大大小。

但组件为什么没有居中并且是最大宽度的一半仍然没有意义。

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添加到BoxLayouted面板中。类似这样的东西:

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
}
}

相关内容

  • 没有找到相关文章

最新更新