Java JPanel没有';不会出现在JOptionPane中
我有一个包含按钮的JDesktopPane。当我单击它时,我想显示一个定制的JOptionPane,在其中我添加了一个JLabel和一个JTable 问题是我在JOptionPane中没有任何内容 这是我的密码:Java JPanel没有';不会出现在JOptionPane中,java,swing,jpanel,joptionpane,Java,Swing,Jpanel,Joptionpane,我有一个包含按钮的JDesktopPane。当我单击它时,我想显示一个定制的JOptionPane,在其中我添加了一个JLabel和一个JTable 问题是我在JOptionPane中没有任何内容 这是我的密码: class Viewer extends JPanel{ public Viewer(){ JLabel l = new JLabel("Hi"); JTable t = new JTable(2,2); JPanel p = new JPanel();
class Viewer extends JPanel{
public Viewer(){
JLabel l = new JLabel("Hi");
JTable t = new JTable(2,2);
JPanel p = new JPanel();
p.add(l,BorderLayout.NORTH);
p.add(t,BorderLayout.CENTER);
}
}
public class JOptionPanesWithJPanel extends JFrame{
JPanel desktoppane;
public JOptionPanesWithJPanel(){
desktoppane = new JPanel();
int inset = 50;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset, screenSize.width - inset*2, screenSize.height - inset*2);
JPanel butPanel = new JPanel();
JButton but = new JButton("click");
butPanel.setVisible(true);
butPanel.add(but);
desktoppane.add(butPanel);
getContentPane().add(desktoppane, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
but.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
Viewer v = new Viewer();
//make JOptionPane resisable
UIManager.put("OptionPane.minimumSize",new Dimension(150,150));
JOptionPane.showMessageDialog(null, v, null, JOptionPane.PLAIN_MESSAGE);
}
});
}
public static void main(String[] args) {
for(javax.swing.UIManager.LookAndFeelInfo lookAndFeelInfo : javax.swing.UIManager.getInstalledLookAndFeels()){
if("Windows".equals(lookAndFeelInfo.getName())){
try {
javax.swing.UIManager.setLookAndFeel(lookAndFeelInfo.getClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
System.out.println(ex);
}
break;
}
}
JOptionPanesWithJPanel j = new JOptionPanesWithJPanel();
}
}
我应该怎么做才能将面板显示在JOptionPane中?先谢谢你
PS:
我使用JoptionPane的原因是,除非用户关闭当前窗口,否则禁止用户单击JDesktopPane中的任何其他位置(以及按钮)。您将组件添加到第二个面板,但没有将面板添加到
查看器中
public Viewer() {
JLabel l = new JLabel("Hi");
JTable t = new JTable(2, 2);
JPanel p = new JPanel(); // <-- Create the new panel
p.add(l, BorderLayout.NORTH);
p.add(t, BorderLayout.CENTER);
// And now what??
}
吹毛求疵
这个
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset, screenSize.width - inset * 2, screenSize.height - inset * 2);
这是一种非常糟糕的确定框架大小/位置的方法。并不是每个人的任务栏/停靠都有相同的大小或位置,你不应该依赖“神奇”数字(你自己编的数字),相反,你应该找到合适的方法来确定环境的当前状态
有关检测屏幕大小和屏幕可查看区域的更多详细信息,请参见。您从未在查看器构造函数中添加过p
。而且p
没有边框布局。你的约束没有影响,真的!我忘记加了!我可以用什么来代替BorderLayout…?将p
的布局设置为BorderLayout怎么样?p.setLayout(new BorderLayout())我不会使用UIManager和minimum size属性,因为这也会影响所有未来的JOptionPanes…非常感谢,我会尝试一下
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset, screenSize.width - inset * 2, screenSize.height - inset * 2);