我的自定义JComponent没有出现?

时间:2014-05-13 14:50:16

标签: java

我想做一个简单的测试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) 

2 个答案:

答案 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);

这将确保您的组件填充框架上的最大可用空间。