gpt4 book ai didi

java - 从外部类更新 JPanel 只会添加另一个类,但不会替换它

转载 作者:行者123 更新时间:2023-12-02 05:00:14 27 4
gpt4 key购买 nike

我的主 Java 程序 (MyFrame) 应该使用由其他类 (MyPanel) 启动的其他 JPanel 更新其 JFrame 中的现有 ContentPanel,具体取决于单击的 JMenuItem 以及将传递新 JPanel 的参数。当我单击 JMenuItem 时,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;

}

}

最佳答案

当我添加 removeAll 调用时,它似乎有效。

import javax.swing.*;
import java.awt.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame {

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
}

private final Container contentContainer;

public MyFrame() {

setTitle("MyFrame");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

setJMenuBar(createMenu());
contentContainer = getContentPane();
contentContainer.add(new MyPanel("Test oO"));

setVisible(true);
}

public JMenuBar createMenu() {

JMenuBar menuBar = new JMenuBar();

JMenu menu = new JMenu("Menu");

JMenuItem menuItem = new JMenuItem("Test");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
MyPanel dynamicPanel = new MyPanel("Test");
contentContainer.removeAll();
contentContainer.add(dynamicPanel);
contentContainer.revalidate();
contentContainer.repaint();
}
});

menu.add(menuItem);

JMenuItem menuItem1 = new JMenuItem("Test 1");
menuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
contentContainer.removeAll();
contentContainer.add(new MyPanel("Test 1"));
contentContainer.revalidate();
contentContainer.repaint();
}
});
menu.add(menuItem1);

menuBar.add(menu);
return menuBar;
}

}

class MyPanel extends JPanel {

public MyPanel(String config) {
JButton testButton = new JButton(config);
add(testButton);
setVisible(true);
revalidate();
repaint();
}
}
  • 我还将您的 main 方法包装在 EventQueue.invokeLater 调用中,以确保所有 Swing 操作都发生在 EDT 上
  • 我删除了与该对话框相关的所有代码,因为不需要这些代码来演示该问题。内嵌了一些其他方法以进一步减少代码片段的长度

如果您需要调试这样的情况,黄金提示:当您的JFrame 已获得焦点。这将打印出该组件的 Swing 层次结构。使用原始代码执行此操作可以清楚地显示内容 Pane 包含多个 MyPanel 实例。

关于java - 从外部类更新 JPanel 只会添加另一个类,但不会替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com