自定义JComponent不适用于流布局

0 java swing layout-manager flowlayout

我创建了一个扩展类 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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();

    }
}
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 5

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

您需要覆盖getPreferredSize()类的方法以将其大小返回到布局管理器可以完成其工作.

自定义绘画是通过覆盖paintComponent()方法完成的.另外,不要在绘画方法中进行I/O. 应该在类的构造函数中读取图像.

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

如果您希望图像从顶部/左侧出现5个像素,则向标签添加边框:

label.setBorder( new EmptyBorder(5, 5, 5, 5) );
Run Code Online (Sandbox Code Playgroud)