我正在试验桌面窗格,以便可以在工作项目中使用它们。这里的问题是,我想在JDesktopPane中使用JInternalFrame,在普通JPanel中它可以正常显示,但不能移动它,使用桌面窗格不会显示任何添加的组件。
下面是最后一次尝试的代码,只是为了学习它是如何工作的简单:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Internal_FrameShowtst extends JFrame{
Internal_FrameShowtst(){
BorderLayout bl = new BorderLayout();
JDesktopPane p = new JDesktopPane();
JPanel p1 = new JPanel();
JButton b = new JButton("click");
JInternalFrame in = new JInternalFrame("Test");
Internal_Frametst ift = new Internal_Frametst();
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//p1.add(new JLabel("hola"));
//in.add(p1);
//in.setVisible(true);
ift.setVisible(true);
}
});
p1.add(b);
bl.addLayoutComponent(p,BorderLayout.CENTER);
//p.add(in);
p.add(ift);
p.repaint();
setLayout(bl);
add(p);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Internal_FrameShowtst().setVisible(true);
}
});
}
}
自定义内部框架类:
import javax.swing.*;
public class Internal_Frametst extends JInternalFrame {
Internal_Frametst(){
JPanel p = new JPanel();
JLabel label = new JLabel("Halo");
setIconifiable(true);
//setIcon(true);
setClosable(true);
p.add(label);
p.setSize(300,300);
add(p);
//setVisible(true);
}
}
我已经阅读并尝试了以下方法:Components inside JDesktopPane not showingJDesktopPane not displaying components when adding JInternalFrame
我尝试过直接添加组件、添加JPanel、添加内部框架、尝试不添加内部框架、在主类中创建内部框架、在其自己的类中创建自己的内部框架、对两个面板(普通面板和桌面面板)使用布局管理器,所有这些都得到了相同的结果。
1条答案
按热度按时间5lhxktic1#
你的代码创建了几个组件,但这些组件从未添加到可见UI中。在你发布的版本中,内部框架是不可见的,使其可见的按钮也不是框架的一部分。但组件的初始大小也有问题。
我强烈建议在源代码中将组件的创建、初始属性的设置以及将组件添加到父组件的代码放在一起。
此外,请考虑Prefer composition over inheritance?中讨论的要点,您的子类是完全不必要的。
下面是代码的修订版本,单击按钮时将打开内部框架:
请注意,
setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE)
对于能够在内部框架关闭后通过setVisible(true)
再次显示框架是必需的。