我创建了一个扩展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();
    }
}发布于 2015-09-21 20:16:16
它不能工作的原因是因为FlowLayout尊重组件的首选大小,并且您没有指定自定义组件的首选大小。
您需要重写类的getPreferredSize()方法,以便将其大小返回给布局管理器可以完成的工作。
自定义绘画是通过重写paintComponent()方法来完成的。另外,不要在绘画方法中做I/O。图像应该在类的构造函数中读取。
但是,问题是为什么要创建自定义组件?只需使用JLabel和ImageIcon。
如果希望图像从顶部/左侧显示5个像素,则向标签中添加边框:
label.setBorder( new EmptyBorder(5, 5, 5, 5) );https://stackoverflow.com/questions/32703542
复制相似问题