gpt4 book ai didi

java - 自定义 JComponent 不适用于流布局

转载 作者:行者123 更新时间:2023-12-01 16:56:07 25 4
gpt4 key购买 nike

我创建了一个扩展 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 尊重组件的首选大小,而您尚未指定自定义组件的首选大小。

您需要重写类的 getPreferredSize() 方法,以将其大小返回给布局管理器来完成其工作。

自定义绘制是通过重写paintComponent()方法来完成的。另外,不要在绘画方法中执行 I/O。应在类的构造函数中读取图像。

但是,问题是为什么要创建自定义组件?只需将 JLabelImageIcon 结合使用即可。

如果您希望图像显示在距顶部/左侧 5 个像素的位置,则可以向标签添加边框:

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

关于java - 自定义 JComponent 不适用于流布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com