我的主要Java程序(MyFrame)应该使用由其他类(MyPanel)启动的其他JPanel来更新其JFrame中的现有ContentPanel,具体取决于所点击的JMenuItem并且新的JPanel的参数将被传递。当我单击JMenuItem时,JPanel不会更新,直到调整窗口大小后,它才会在第一个之后,而不是在前景中。请你能帮我解决这个问题吗?从外部类更新JPanel将只添加另一个,但不会替换它
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
public class MyFrame extends JFrame {
private Container contentContainer;
public static void main(String[] args) {
new MyFrame();
}
public MyFrame() {
setTitle("MyFrame");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setJMenuBar(createMenu());
MyPanel panel = makePanel(new String("Test oO"));
contentContainer = this.getContentPane();
setVisible(true);
}
public JMenuBar createMenu() {
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
JMenuItem menuItem = new JMenuItem("Test");
menuItem.setMnemonic(KeyEvent.VK_E);
menuItem.setToolTipText("Test");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
MyPanel dynamicPanel = makePanel(new String("Test"));
contentContainer.add(dynamicPanel);
contentContainer.revalidate();
contentContainer.repaint();
}
});
menu.add(menuItem);
JMenuItem menuItem1 = new JMenuItem("Test 1");
menuItem1.setMnemonic(KeyEvent.VK_E);
menuItem1.setToolTipText("Test 1");
menuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
MyPanel dynamicPanel1 = makePanel(new String("Test 1"));
contentContainer.add(dynamicPanel1);
revalidate();
repaint();
}
});
menu.add(menuItem1);
JMenuItem menuItem2 = new JMenuItem("Dialog");
menuItem2.setMnemonic(KeyEvent.VK_E);
menuItem2.setToolTipText("Dialog");
menuItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
makeDialog(new String("Zur Info"), new String("Du hast Edit geklickt"));
}
});
menu.add(menuItem2);
menuBar.add(menu);
return menuBar;
}
public JDialog makeDialog(String title, String content) {
JDialog meinJDialog = new JDialog();
meinJDialog.setTitle(title);
JTextArea contentArea = new JTextArea(content);
contentArea.setEditable(false);
meinJDialog.add(contentArea);
meinJDialog.setSize(200,200);
meinJDialog.setModal(true);
meinJDialog.setLocationRelativeTo(null);
meinJDialog.setVisible(true);
return meinJDialog;
}
public MyPanel makePanel(String config) {
MyPanel panel = new MyPanel(config);
panel.revalidate();
panel.repaint();
return panel;
}
}
class MyPanel extends JPanel {
public MyPanel(String config) {
JButton testButton = new JButton(config);
add(testButton);
setVisible(true);
revalidate();
repaint();
return;
}
}
add revalidate();重绘();在新的面板添加 – StanislavL 2015-02-05 13:49:39
抱歉,但没有效果,新添加的面板仍然是第一个..请编译我的例子,运行它,并调整帧的大小。你会看到它会被添加到背景中。 – BrainWorx 2015-02-05 14:01:46
问题是,你仍然*有一个前面的面板。然后你在中间位置有多个面板,而'BorderLayout'只能对应一个面板。您需要在添加新的之前将其删除(然后重新验证+重新绘制)。 'contentContainer.remove(0)'会对上面的示例有效。也就是说,当你考虑更换组件时,[CardLayout](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)往往是更好的选择。 – kiheru 2015-02-05 14:18:16