自定义 JComponent 不适用于流布局
Custom JComponent does not work with flow layout
我创建了一个 class 扩展 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 尊重组件的首选大小,而您没有指定自定义组件的首选大小。
您需要将 class 的 getPreferredSize()
方法重写为 return 它的大小,以便布局管理器可以完成他们的工作。
自定义绘画是通过重写 paintComponent()
方法完成的。另外,不要在绘画方法中做I/O。该图像应在 class.
的构造函数中读取
但是,问题是您为什么要创建自定义组件?只需使用 JLabel
和 ImageIcon
.
如果您希望图像显示在距 top/left 5 个像素的位置,则向标签添加边框:
label.setBorder( new EmptyBorder(5, 5, 5, 5) );
我创建了一个 class 扩展 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 尊重组件的首选大小,而您没有指定自定义组件的首选大小。
您需要将 class 的 getPreferredSize()
方法重写为 return 它的大小,以便布局管理器可以完成他们的工作。
自定义绘画是通过重写 paintComponent()
方法完成的。另外,不要在绘画方法中做I/O。该图像应在 class.
但是,问题是您为什么要创建自定义组件?只需使用 JLabel
和 ImageIcon
.
如果您希望图像显示在距 top/left 5 个像素的位置,则向标签添加边框:
label.setBorder( new EmptyBorder(5, 5, 5, 5) );