Java 如何在按钮上刷新JInternalFrame或JPanel表单单击此处JPanel是一个单独的类并在JInternalFrame中使用

Java 如何在按钮上刷新JInternalFrame或JPanel表单单击此处JPanel是一个单独的类并在JInternalFrame中使用,java,swing,jframe,jpanel,jinternalframe,Java,Swing,Jframe,Jpanel,Jinternalframe,我正在尝试构建一个桌面应用程序,在一个JFrame中包含多个屏幕。 因此,每个按钮单击事件都会将我们带到单独的屏幕,屏幕中有刷新的组件。到目前为止,这种方法对我有效,但我面临的问题甚至是在使用“.dispose(),.repaint(),.revalidate(),.invalidate()函数之后。JInternalFrame或Jpanel似乎没有刷新其组件 它的工作原理类似于下面的gif 我确实知道JtabbedPane存在,但对于我的方法,JtabbedPane是不可行的 下面我通过复制

我正在尝试构建一个桌面应用程序,在一个JFrame中包含多个屏幕。 因此,每个按钮单击事件都会将我们带到单独的屏幕,屏幕中有刷新的组件。到目前为止,这种方法对我有效,但我面临的问题甚至是在使用“.dispose(),.repaint(),.revalidate(),.invalidate()函数之后。JInternalFrame或Jpanel似乎没有刷新其组件

它的工作原理类似于下面的gif

我确实知道JtabbedPane存在,但对于我的方法,JtabbedPane是不可行的

下面我通过复制我所面临的问题来发布缩小的代码

Java(包含主类的文件)

以及相应的Jpanel类文件,其中包含内部框架 Panel1.java

package test;

import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;

public class Panel1 extends JPanel {
    private JTextField textField;

    /**
     * Create the panel.
     */
    public Panel1() {
        setLayout(null);
        
        textField = new JTextField();
        textField.setBounds(10, 60, 430, 19);
        add(textField);
        textField.setColumns(10);
        
        JButton btnNewButton = new JButton("Example Button");
        btnNewButton.setBounds(10, 156, 430, 21);
        add(btnNewButton);

    }
}
Panel2.java

package test;

import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;

public class Panel2 extends JPanel {
    private JTextField textField;

    /**
     * Create the panel.
     */
    public Panel2() {
        setLayout(null);
        
        textField = new JTextField();
        textField.setBounds(10, 60, 430, 19);
        add(textField);
        textField.setColumns(10);
        
        JButton btnNewButton = new JButton("New button2");
        btnNewButton.setBounds(21, 157, 419, 21);
        add(btnNewButton);

    }
}
注:这是我第一次在Stackoverflow提问,所以请原谅我,如果可能的话,如果我遗漏了什么,请指导我

谢谢:)

编辑: 我面临的问题是从表面上看,Jpanel看起来已经刷新了,但是像JtextField这样的组件仍然隐藏了先前写入的文本,并且只在我单击该JtextField时才显示文本

下面我附上另一个gif,它突出显示了这个问题。我强调了我面临的问题


您可以在Jframes中使用JPanel,然后使用来更改面板(其作用可能类似于不同的屏幕)

dispose()方法不会删除组件,因此在使用以下内容时,您可以继续向内部框架添加组件:

internalFrame1.getContentPane().add(panel1);
相反,您可以执行以下操作:

Container contentPane = internalFrame1.getContentPane();
contentPane.removeAll();
contentPane.add( panel1 );
contentPane.revalidate();
contentPane.repaint();

我道歉,如果我不清楚,但上面的代码我已经张贴选择Jpanels作为单独的屏幕,我不知道我去哪里出错。但是你的建议看起来就像是我已经在做的UI更改。JInternalFrame或Jpanel似乎没有刷新它的组件。-我不确定你期望发生什么。每次单击按钮时,我都会看到按钮上的标题和文本发生变化。这意味着组件已刷新。其他问题:1)变量名不应以大写字符开头。2) 不要使用null布局和setBounds()。Swing设计用于布局管理器。例如,没有理由使用JScrollPane,因为添加到其中的组件使用空布局时,它不起作用。3)revalidate()仅在使用布局管理器时起作用。移除/添加组件后,会在容器上调用revalidate()和repaint()。@camickr感谢您在我的代码中发现的其他问题。我已经更新了我的问题,并在我面临的问题的特定部分发布。如果可能的话,请看一看,并向我建议可能的解决方案。如果我在你的评论中遗漏了什么,我道歉。非常感谢。
Container contentPane = internalFrame1.getContentPane();
contentPane.removeAll();
contentPane.add( panel1 );
contentPane.revalidate();
contentPane.repaint();