Java JFrame 意外地奇怪地删除组件
Java JFrame Removing Components Weirdly by Accident
我的 Java JFrame 项目的组件存在问题,删除了 JComboBox
在 space 中使用的所有内容。
我的程序中的bug视频示例可以直观查看here。
主要代码如下。您可以通过将 3 个面板替换为 random JCombobox(es)
并使用主 class 调用它来复制它。
如有任何帮助,我们将不胜感激。
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DisplayPage extends JFrame implements ActionListener {
EnterDetailsPage newRecord;
ViewMore viewMoreRecord;
ViewPage viewRecord;
JPanel contentPanel = new JPanel(new FlowLayout());
public DisplayPage(){
setLayout(new BorderLayout());
setSize(900, 600);
setTitle("Add Flight Details");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPage(1);
MenuSection menuSection = new MenuSection();
//Add action listener to buttons
menuSection.addNewButton.addActionListener(this::addActionPerformed);
menuSection.updateButton.addActionListener(this::updateActionPerformed);
menuSection.viewButton.addActionListener(this::viewActionPerformed);
add("West", menuSection.getMainMenu());
add("Center", contentPanel);
setVisible(true);
}
public void setPage(int selection){
contentPanel.removeAll();
contentPanel.revalidate();
//contentPanel.repaint();
switch (selection) {
case 1:
newRecord = new EnterDetailsPage();
contentPanel = newRecord.getTotalPanel();
break;
case 2:
viewMoreRecord = new ViewMore();
contentPanel = viewMoreRecord.getViewMorePanel();
break;
case 3:
viewRecord = new ViewPage();
contentPanel = viewRecord.getUpdatePagePanel();
break;
}
add("Center", contentPanel);
}
public void actionPerformed(ActionEvent e){
}
public void addActionPerformed(ActionEvent e){
setPage(1);
}
public void updateActionPerformed(ActionEvent e){
setPage(2);
}
public void viewActionPerformed(ActionEvent e){
setPage(3);
}
}
与其费心制作自己的 GUI,不如查看 java 文档以检查是否有与您想要使用的类似的内容。
无需制作您自己的 "MenuSection",已经有 JTabbedPanes,您可以更轻松地使用它(没有闪烁和其他图形问题)。
https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html
或者,您可以使用 CardLayout。
https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html
CardLayout 示例:
public class DisplayPage extends JFrame implements ActionListener {
...
CardLayout cl;
...
public DisplayPage(){
...
cl = new CardLayout();
contentPanel.setLayout(cl);
...
contentPanel.add(newRecord,"newRecord");
contentPanel.add(viewMoreRecord,"viewMoreRecord");
contentPanel.add(viewRecord,"viewRecord");
...
cl.show(contentPanel,"newRecord");
}
public void addActionPerformed(ActionEvent e){
cl.show(contentPanel,"newRecord");
}
public void updateActionPerformed(ActionEvent e){
cl.show(contentPanel,"viewMoreRecord");
}
public void viewActionPerformed(ActionEvent e){
cl.show(contentPanel,"viewRecord");
}
我的 Java JFrame 项目的组件存在问题,删除了 JComboBox
在 space 中使用的所有内容。
我的程序中的bug视频示例可以直观查看here。
主要代码如下。您可以通过将 3 个面板替换为 random JCombobox(es)
并使用主 class 调用它来复制它。
如有任何帮助,我们将不胜感激。
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DisplayPage extends JFrame implements ActionListener {
EnterDetailsPage newRecord;
ViewMore viewMoreRecord;
ViewPage viewRecord;
JPanel contentPanel = new JPanel(new FlowLayout());
public DisplayPage(){
setLayout(new BorderLayout());
setSize(900, 600);
setTitle("Add Flight Details");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPage(1);
MenuSection menuSection = new MenuSection();
//Add action listener to buttons
menuSection.addNewButton.addActionListener(this::addActionPerformed);
menuSection.updateButton.addActionListener(this::updateActionPerformed);
menuSection.viewButton.addActionListener(this::viewActionPerformed);
add("West", menuSection.getMainMenu());
add("Center", contentPanel);
setVisible(true);
}
public void setPage(int selection){
contentPanel.removeAll();
contentPanel.revalidate();
//contentPanel.repaint();
switch (selection) {
case 1:
newRecord = new EnterDetailsPage();
contentPanel = newRecord.getTotalPanel();
break;
case 2:
viewMoreRecord = new ViewMore();
contentPanel = viewMoreRecord.getViewMorePanel();
break;
case 3:
viewRecord = new ViewPage();
contentPanel = viewRecord.getUpdatePagePanel();
break;
}
add("Center", contentPanel);
}
public void actionPerformed(ActionEvent e){
}
public void addActionPerformed(ActionEvent e){
setPage(1);
}
public void updateActionPerformed(ActionEvent e){
setPage(2);
}
public void viewActionPerformed(ActionEvent e){
setPage(3);
}
}
与其费心制作自己的 GUI,不如查看 java 文档以检查是否有与您想要使用的类似的内容。 无需制作您自己的 "MenuSection",已经有 JTabbedPanes,您可以更轻松地使用它(没有闪烁和其他图形问题)。 https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html
或者,您可以使用 CardLayout。 https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html
CardLayout 示例:
public class DisplayPage extends JFrame implements ActionListener {
...
CardLayout cl;
...
public DisplayPage(){
...
cl = new CardLayout();
contentPanel.setLayout(cl);
...
contentPanel.add(newRecord,"newRecord");
contentPanel.add(viewMoreRecord,"viewMoreRecord");
contentPanel.add(viewRecord,"viewRecord");
...
cl.show(contentPanel,"newRecord");
}
public void addActionPerformed(ActionEvent e){
cl.show(contentPanel,"newRecord");
}
public void updateActionPerformed(ActionEvent e){
cl.show(contentPanel,"viewMoreRecord");
}
public void viewActionPerformed(ActionEvent e){
cl.show(contentPanel,"viewRecord");
}