我创建了一个扩展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
复制相似问题