如何解决如何在单击按钮时刷新JInternalFrame或JPanel表单,其中JPanel是一个单独的类并在JInternalFrame中使用
我试图在一个JFrame中构建一个具有多个屏幕的桌面应用程序。 因此,每个按钮单击事件将带我们进入单独的屏幕,屏幕中包含刷新的组件。到目前为止,这种方法对我来说是可行的,但是即使使用了“ .dispose()、. repaint()、. revalidate()、. invalidate()”函数,我仍然面临着问题。 JInternalFrame或Jpanel似乎不刷新其组件。
哪个工作类似于gif以下。
我确实知道JtabbedPane存在,但是对于我的方法JtabbedPane不可行。
下面,我通过复制所面临的问题来发布缩小的代码。
MainMenu.Java(带有主类的文件)
package test;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JInternalFrame;
public class MainMenu extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainMenu frame = new MainMenu();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MainMenu() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,841,522);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(10,10,807,63);
contentPane.add(panel);
panel.setLayout(new GridLayout(1,0));
JButton Tab1 = new JButton("Tab1");
panel.add(Tab1);
JButton Tab2 = new JButton("Tab2");
panel.add(Tab2);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10,88,387);
contentPane.add(scrollPane);
JInternalFrame internalFrame1 = new JInternalFrame();
JInternalFrame internalFrame2 = new JInternalFrame();
Tab1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Panel1 panel1 = new Panel1();
if(internalFrame1 !=null) {
internalFrame1.dispose();
panel1.invalidate();
panel1.revalidate();
panel1.repaint();
}
internalFrame1.setTitle("Panel 1");
scrollPane.setViewportView(internalFrame1);
internalFrame1.getContentPane().add(panel1);
internalFrame1.setVisible(true);
}
});
Tab2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Panel2 panel2 = new Panel2();
if(internalFrame2 !=null) {
internalFrame2.dispose();
panel2.invalidate();
panel2.revalidate();
panel2.repaint();
}
internalFrame2.setTitle("Panel 2");
scrollPane.setViewportView(internalFrame2);
internalFrame2.getContentPane().add(panel2);
internalFrame2.setVisible(true);
}
});
}
}
以及相应的Jpanel类文件,其中JInternal Frames 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,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,19);
add(textField);
textField.setColumns(10);
JButton btnNewButton = new JButton("New button2");
btnNewButton.setBounds(21,157,419,21);
add(btnNewButton);
}
}
P.S:这是我第一次在Stackoverflow中提问,所以请原谅我,如果可以的话,可以指导我
谢谢:)
编辑: 我面临的问题是表面上看起来Jpanel已刷新,但是JtextField之类的组件仍在其中隐藏了以前编写的文本,并且仅当我单击该JTextField时才显示文本
在我下面附加的另一个gif显示了该问题。我已经强调了我面临的问题。
解决方法
您可以在Jframe中使用JPanel,然后使用CardLayout来更改面板(其作用可能类似于不同的屏幕)
,dispose()方法不会删除组件,因此当您使用以下命令时,您会继续向内部框架添加组件:
internalFrame1.getContentPane().add(panel1);
相反,您可以执行以下操作:
Container contentPane = internalFrame1.getContentPane();
contentPane.removeAll();
contentPane.add( panel1 );
contentPane.revalidate();
contentPane.repaint();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。