Java 我的自定义JComponent没有显示?
我想做一个简单的测试JComponent,以便在调用repaint()、paintComponent()和重写paint或update中的所有方法时可以看到事情是如何工作的。这只是为了学习,我知道这在现实世界中是不可能做到的 首先,我想做一个组件,我可以画一条到x和y点的线。我希望我的JComponent类拥有JComponent类中应该包含的每个方法,即使它没有被使用。因此,我希望列出创建自己的JComponent时需要重写的每个方法。(这是供以后使用的) 我的主要问题是为什么我的组件不会在我用来绘制所有组件的JPanel上呈现 问题:为什么我的组件没有出现在我的JPanel上? 我还想尝试将这篇文章作为从头开始构建JComponent的学习选项。我将在底部添加工作代码,同时添加不工作的代码 代码: JComponent类:Java 我的自定义JComponent没有显示?,java,Java,我想做一个简单的测试JComponent,以便在调用repaint()、paintComponent()和重写paint或update中的所有方法时可以看到事情是如何工作的。这只是为了学习,我知道这在现实世界中是不可能做到的 首先,我想做一个组件,我可以画一条到x和y点的线。我希望我的JComponent类拥有JComponent类中应该包含的每个方法,即使它没有被使用。因此,我希望列出创建自己的JComponent时需要重写的每个方法。(这是供以后使用的) 我的主要问题是为什么我的组件不会在我
package testpak;
import java.awt.Graphics;
import javax.swing.JComponent;
public class MyComponent extends JComponent {
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(10, 10, 100, 100);
}
public void paint(Graphics g) {
super.paint(g);
paintComponent(g);
paintBorder(g);
paintChildren(g);
}
}
新代码:
package testpak;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
public class MyComponent extends JComponent {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredSize () {
return new Dimension(100, 25);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(10, 10, 100, 100);
}
public void paintBorder(Graphics g) {
super.paintBorder(g);
g.setColor(Color.YELLOW);
g.fillRect(0, 0, 50, 50);
g.setColor(Color.BLACK);
g.drawRect(0, 0, 50, 50);
}
public void paint(Graphics g) {
super.paint(g);
paintComponent(g);
paintBorder(g);
paintChildren(g);
}
}
这是新代码。我设置了首选尺寸,然后画了一个填充的黄色矩形和一个黑色边框。边框似乎没有显示在底部和右侧尺寸上。有人可以试试这个,看看是否对他们有效
将引发错误的代码
我试图将这两种方法包含到我的JComponent中。如果我只有第一个setSize(…),那么一切都正常。如果我还包括注释掉的版本,那么我将收到和错误
@Override
public void setSize(Dimension d) {
this.setSize(d);
}
// @Override
// public void setSize(int x, int y) {
// Dimension d = new Dimension(x,y);
// this.setSize(d);
// }
错误:
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
at testpak.MyComponent.setSize(MyComponent.java:15)
您不必担心上面代码中的额外面板,只需执行以下操作:
frame.setLayout(new BorderLayout());
frame.add(cc, BorderLayout.CENTER);
这将确保您的组件填满框架上的最大可用空间。
JPanel
使用符合组件首选尺寸的FlowLayout
。您需要覆盖MyComponent
的getPreferredSize
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 400);
}
在使框架可见之前,也只能使用
frame.pack()
而不是setSize
。不是一个好的解决方案。所有Swing组件都应该实现getPreferredSize()(和最小/最大)方法以返回适当的值。然后该组件可以与任何布局管理器一起使用。
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 400);
}