我正在尝试创建其中包含一些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。
可能是什么问题? 还有其他办法吗?
答案 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);
}
}
}
答案 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);
最后,您应该使用适当的布局,即BorderLayout
或GridLayout
等
答案 3 :(得分:0)
对于JPanel,默认为BorderLayout,因此无需设置布局。您将标签添加到内容窗格中。试试这个
{
JLabel lb1 = new JLabel(val);
getContentPane().add(val);
}