我创建了一个扩展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();
}
}
答案 0 :(得分:5)
它不起作用的原因是因为FlowLayout尊重组件的首选大小,并且您没有指定自定义组件的首选大小。
您需要覆盖类的getPreferredSize()
方法,以便将其大小返回到布局管理器可以完成其工作。
通过覆盖paintComponent()
方法完成自定义绘制。另外,不要在绘画方法中进行I / O.应该在类的构造函数中读取图像。
但是,问题是为什么要创建自定义组件?只需使用带JLabel
的{{1}}。
如果您希望图像从顶部/左侧出现5个像素,则可以在标签上添加边框:
ImageIcon