Java 我的自定义JComponent没有显示?

Java 我的自定义JComponent没有显示?,java,Java,我想做一个简单的测试JComponent,以便在调用repaint()、paintComponent()和重写paint或update中的所有方法时可以看到事情是如何工作的。这只是为了学习,我知道这在现实世界中是不可能做到的 首先,我想做一个组件,我可以画一条到x和y点的线。我希望我的JComponent类拥有JComponent类中应该包含的每个方法,即使它没有被使用。因此,我希望列出创建自己的JComponent时需要重写的每个方法。(这是供以后使用的) 我的主要问题是为什么我的组件不会在我

我想做一个简单的测试JComponent,以便在调用repaint()、paintComponent()和重写paint或update中的所有方法时可以看到事情是如何工作的。这只是为了学习,我知道这在现实世界中是不可能做到的

首先,我想做一个组件,我可以画一条到x和y点的线。我希望我的JComponent类拥有JComponent类中应该包含的每个方法,即使它没有被使用。因此,我希望列出创建自己的JComponent时需要重写的每个方法。(这是供以后使用的)

我的主要问题是为什么我的组件不会在我用来绘制所有组件的JPanel上呈现

问题:为什么我的组件没有出现在我的JPanel上?

我还想尝试将这篇文章作为从头开始构建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);
}