使用组件创建JPanel

时间:2014-01-15 08:57:19

标签: java swing

我正在尝试创建其中包含一些JLabel的JPanel,我希望通过JPanel的构造函数传递值。 如下所示。

class MyPanel extends JPanel
 {

 private JLabel lbl;

     public MyPanel(String val)
{
   super();
   lbl=new JLabel(val);
   this.add(lbl);
}
 } 

使用此面板时MyPanel mp=new MyPanel("value");

但是我无法在Panel中看到Label。

可能是什么问题? 还有其他办法吗?

4 个答案:

答案 0 :(得分:2)

有可能,您尝试在框架中添加多个组件而不指定BorderLayout个问题。 JFrame有一个默认BorderLayout。未指定,所有组件都将添加到BorderLayout.CENTER位置。每个职位只能容纳一个部分。因此,只有您添加的最后一个组件才会可见。

  • 您可以将另一个布局管理器设置为框架,

  • 或添加具有指定位置的组件,例如

    frame.add(new MyPanel(), BorderLayout.CENTER);
    frame add(anotherPanel, BorderLayout.SOUTH);
    
  • 还要确保在框架上调用.pack(),以便尊重所有首选尺寸。如果您正在做的事情,请避免使用.setSize()


修改

适合我。也许你忘了将String传递给构造函数。运行此测试

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test3 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MyPanel("Hello, World!"));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static class MyPanel extends JPanel {

        private JLabel lbl;

        public MyPanel(String val) {
            super();
            lbl = new JLabel(val);
            this.add(lbl);
        }
    }
}

enter image description here

答案 1 :(得分:1)

您应该为MyPanel定义LayoutManager

e.g。

setLayout(new BorderLayout());
this.add(lbl, BorderLayout.CENTER);

答案 2 :(得分:1)

在动态添加新repaint()之后,您可能需要validate()JPanel JLabel

lbl=new JLabel(val);
this.add(lbl);
this.validate();

lbl=new JLabel(val);
this.add(lbl);
this.repaint();

还可以使用setSize(getPreferedSize())setLocation()

lbl.setSize(lbl.getPreferredSize());
lbl.setLocation(50, 20);

最后,您应该使用适当的布局,即BorderLayoutGridLayout

答案 3 :(得分:0)

对于JPanel,默认为BorderLayout,因此无需设置布局。您将标签添加到内容窗格中。试试这个

{

JLabel lb1 = new JLabel(val);
getContentPane().add(val);

}