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

问题描述 投票:0回答:1

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

我不确定我缺少什么。谢谢!

java swing jcomponent boxlayout
1个回答
0
投票

覆盖方法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
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.