Java Swing - 我如何绘制这个扩展JComponent的类

时间:2015-04-10 10:16:29

标签: java swing jcomponent

我尝试创建一个扩展JComponents的类,但是当我将它添加到Box时,我只能看到一个空窗口。你能帮助我吗? 我期待得到的是一个窗口,有3个水平框,旁边有一个标签和一个按钮。

public class MyWindowComp{
    public MyWindowComp(){

    JFrame frame = new JFrame("myFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel wp = new JPanel(new BorderLayout());

    Box vBox = new Box(BoxLayout.Y_AXIS);

    MyComponent one = new MyComponent();
    MyComponent two = new MyComponent();
    MyComponent three = new MyComponent();

    vBox.add(one);
    vBox.add(two);
    vBox.add(three);

    wp.add(vBox);


    frame.add(wp);
    frame.setVisible(true);
    }}

public class MyComponent extends JComponent {

private Box box;
private JButton b;
private JLabel l;

public MyComponent(){
    this.box = new Box(BoxLayout.X_AXIS);

    this.l = new JLabel ("label");
    this.l.setVisible(true);
    this.b =  new JButton("button");
    this.b.setVisible(true);

    box.add(l);
    box.add(b);

}}

获得:enter image description here

预期:enter image description here

2 个答案:

答案 0 :(得分:3)

您创建了MyComponent组件的实例,但您从不向组件添加任何组件,因此无需绘制任何内容。

在MyComponent classe的构造函数中,您创建一个Box,然后向Box添加两个组件,但不要将Box添加到组件中。

解决方案是摆脱Box并将按钮和标签直接添加到组件中:

public MyComponent()
{
    setLayout( new BoxLayout(this, BoxLayout.X_AXIS) );

    l = new JLabel ("label");
    b =  new JButton("button");

    add(l);
    add(b);
}

此外:

  1. 不需要在每个组件上使用setVisible(true),因为默认情况下组件是可见的(除了像JFrame这样的顶级容器)。
  2. 通常你会扩展JPanel,因为面板的目的是包含其他组件。

答案 1 :(得分:0)

看起来像个作业,我会尝试作为老师回答

  1. 您忘记了加载MyWindowComp()方法的方法

  2. 如果已加载,并且只显示菜单栏,则您忘记使用frame.setSize(x,y)设置大小;