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

时间:2015-02-05 13:40:12

标签: java swing

我的主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 个答案:

答案 0 :(得分:2)

当我添加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调用中包装了您的main方法,以确保在EDT上发生所有Swing操作
  • 我删除了与对话框相关的所有代码,因为这不需要用来演示问题。内联一些其他方法来进一步缩短代码片段的长度

黄金提示如果您需要调试这样的情况:按 ctrl shift F1 JFrame非常关注。这将打印出该组件的Swing层次结构。使用原始代码执行此操作会清楚地显示内容窗格包含多个MyPanel个实例。