当前位置: 首页 > 知识库问答 >
问题:

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

薛文斌
2023-03-14

我的主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;

    }

}

共有1个答案

贡英华
2023-03-14

当我添加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();
  }
}
  • 我还将您的主方法包装在EventQueue中。调用invokeLater以确保所有Swing操作都在EDT上进行

如果您需要调试这样的情况,那么黄金提示是:当您的JFrame处于焦点时,按ctrlshiftF1。这将打印出该组件的Swing层次结构。使用原始代码执行此操作清楚地显示内容窗格包含多个MyPanel实例。

 类似资料:
  • 问题内容: 我对Java Swing还是很陌生,并且遇到了一些问题。 附带的问题是,在制作相当大的Java Swing应用程序时,拆分代码的最佳方法是什么?在我的情况下,我希望有一个布局与Microsoft Word一样的应用程序,其中的JToolBar充满按钮,而主JPanel则根据工具栏中的按钮进行更改。 因此,如下面的代码所示,我有一个JFrame并调用MainPanel类以创建面板并添加带

  • 我对Java Swing还很陌生,遇到了一些问题。

  • 我想在一个JFrame中用另一个Jpanel替换一个Jpanel,我已经搜索并尝试了我的代码,但什么也没有发生,这是我的代码: 有人能帮帮我吗?多谢

  • 假设我有以下代码: 这段代码运行后,的值将为

  • 我想做一个应用程序,当我按下AddTask类中的save按钮时,文本输入中的文本将直接更新到Details类中的标签,但我所做的在那里不起作用…有谁能帮我一下吗?

  • 问题内容: 将包含图形的添加到时,效果很好。但是,当我尝试添加 其中添加了其他图形的时,它不会显示在中。请参见下面的代码 问题答案: 请注意类的构造函数,使其成为您的习惯,以遵循本示例中所示的顺序。首先向中添加组件,然后再进行调用,例如 ,而不是在此之前。 始终把它当作习惯,每当您覆盖方法时,也要覆盖方法。 并始终像在EDT- 事件调度线程中那样发出呼叫。请阅读Swing中的Concurrency