我想做一个简单的测试JComponent,这样我就可以看到调用repaint(),paintComponent()并覆盖paint或update中的所有方法时的工作原理。这只是为了学习,我知道这不会在现实世界中完成。
首先,我想能够制作一个可以在x和y点画线的组件。我希望我的JComponent类拥有应该在JComponent类中的每个方法,即使它没有被使用。因此,我想要一个需要重写的每个方法的列表,以创建自己的JComponent。 (这是为了以后)
我的主要问题是为什么我的组件不能在我的JPanel上呈现我用来绘制所有组件的内容。
问题:为什么我的组件没有出现在我的JPanel上?
此外,我想尝试将此帖子作为从头开始构建JComponent的学习选项。我将在我去的底部添加工作代码,并且代码也不起作用。
代码:
package testpak;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import java.awt.*;
public class FrameDemo {
JFrame frame = new JFrame("FrameDemo");
JPanel panel = new JPanel();
MyComponent cc = new MyComponent();
FrameDemo() {
setLookFeel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
panel.add(cc);
frame.add(panel);
frame.setSize( new Dimension(200, 200));
frame.setVisible(true);
}
private void setLookFeel() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
}
public static void main(String[] args) {
FrameDemo fd = new FrameDemo();
}
}
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)
答案 0 :(得分:2)
JPanel
使用尊重组件首选大小的FlowLayout
。您需要覆盖getPreferredSize
的{{1}}。
MyComponent
在使框架可见之前,也只能使用@Override
public Dimension getPreferredSize() {
return new Dimension(500, 400);
}
代替frame.pack()
。
答案 1 :(得分:1)
您不必担心上面代码中的额外面板,您可以这样做:
frame.setLayout(new BorderLayout());
frame.add(cc, BorderLayout.CENTER);
这将确保您的组件填充框架上的最大可用空间。