Java JFrame: странное удаление компонентов в результате несчастного случая - PullRequest
0 голосов
/ 11 апреля 2020

Мой Java В проекте JFrame были обнаружены ошибки в компонентах, удалено все, что JComboBox использовалось в космосе.

Видео-пример ошибки в моей программе можно посмотреть визуально здесь .

Основной код указан ниже. Вы можете повторить его, заменив 3 панели на random JCombobox(es) и используя основной класс для вызова.

Любая помощь будет принята.

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);
    }
}

1 Ответ

0 голосов
/ 11 апреля 2020

Вместо того, чтобы делать свой собственный 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");
    }
...