自定义 JComponent 不适用于流布局

Custom JComponent does not work with flow layout

我创建了一个 class 扩展 JComponent 并想在 JPanel 上使用它。如果我设置了它的边界,我就不能按我想要的方式在 FlowLayout 中使用它;它出现在 JPanel 上,就好像它在使用绝对定位一样。如果我不指定边界,它根本不会出现。解决方案是什么?

谢谢。

JMotor.java:

public class JMotor extends JComponent {

    public void paint(Graphics g) {

        Graphics2D g2 = (Graphics2D) g;
        BufferedImage img = null;

        try {
            img = ImageIO.read(new File("motor.jpg"));
        } 

        catch (Exception e) {

        }

        g2.drawImage(img, 5, 5, this);
        //setBounds(5, 5, 100, 50);
    }
}

Scada.java:

public class Scada {

    JFrame scadaFrame;
    JPanel scadaPanel;

    Scada () {

        scadaFrame = new JFrame("Scada");
        scadaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        scadaPanel = new JPanel();          

        scadaPanel.add(new JSuruculuMotor());
        scadaPanel.add(new JMotor());

        scadaFrame.setContentPane(scadaPanel);
        scadaFrame.setSize(600,300);    
        scadaFrame.setVisible(true);
    }

    public static void main(String[] args) {

        new Scada();

    }
}

它不起作用的原因是 FlowLayout 尊重组件的首选大小,而您没有指定自定义组件的首选大小。

您需要将 class 的 getPreferredSize() 方法重写为 return 它的大小,以便布局管理器可以完成他们的工作。

自定义绘画是通过重写 paintComponent() 方法完成的。另外,不要在绘画方法中做I/O。该图像应在 class.

的构造函数中读取

但是,问题是您为什么要创建自定义组件?只需使用 JLabelImageIcon.

如果您希望图像显示在距 top/left 5 个像素的位置,则向标签添加边框:

label.setBorder( new EmptyBorder(5, 5, 5, 5) );