如何在不同类的 JPanels 之间切换?我不想使用卡片布局。
我有2节课 - MainPage
和MenuPage
。例如,我想清除contentPane
(JPanel
)@MainPage
并将其替换为内容窗格@MenuPage
。出于测试目的,我包含一个按钮@MenuPage
。
请参阅我的以下尝试 - 它给出了一个错误:
java.lang.IllegalArgumentException: adding a window to a container
MainPage
public class MainPage extends JFrame {
private static JPanel contentPane;
private JLabel imgBackground;
private JLabel lblTitle;
private JLabel imgLogo;
private Dimension dim;
//timer
private final static int interval = 40;
private int i;
private Timer t;
//private JButton start;
//private JLabel lblLoading;
private JProgressBar pbar;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainPage frame = new MainPage();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MainPage() {
dim = Toolkit.getDefaultToolkit().getScreenSize();
System.out.println(dim);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
contentPane.setBounds(0,0,dim.width,dim.height);
setContentPane(contentPane);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
t = new Timer (interval, new ActionListener(){
public void actionPerformed(ActionEvent e) {
if (i == 20){
t.stop();
//start.setEnabled(true);
//refresh + load next page ???
contentPane.removeAll();
MenuPage loadpanel2 = new MenuPage();
setContentPane(loadpanel2);
revalidate();
repaint();
}
else{
i++;
pbar.setValue(i);
}
}
});
t.start();
MenuPage
public class MenuPage extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MenuPage frame = new MenuPage();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MenuPage() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);
JButton btnSadfsafsa = new JButton("sadfsafsa");
btnSadfsafsa.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
btnSadfsafsa.setBounds(10, 52, 89, 23);
btnSadfsafsa.setEnabled(true);
btnSadfsafsa.setVisible(true);
contentPane.add(btnSadfsafsa);
}
}
java.lang.IllegalArgumentException: adding a window to a container
这很简单。 这两个 GUI 都扩展JFrame
,因此是顶级容器。 我们不能将一个顶级容器添加到另一个顶级容器。
两个 GUI 都可能扩展JPanel
,而不是扩展帧。 然后,可以将JPanel
(或多个)添加到在main(String[])
或showGUI()
方法中实例化的JFrame
。