自定义JComponent不适用于流布局

时间:2015-09-21 19:59:03

标签: 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);
    }
}

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

    }
}

1 个答案:

答案 0 :(得分:5)

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

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

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

但是,问题是为什么要创建自定义组件?只需使用带JLabel的{​​{1}}。

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

ImageIcon