GUI программа зависла - PullRequest
       6

GUI программа зависла

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

, поэтому я проектирую GUI (сам GUI находится в отдельном классе, называемом main GUI). GUI имеет 2 кнопки, каждая из которых устанавливает main.subProgramNumber на 1 или 2 (в зависимости от кнопки), устанавливает main.safeToContinue в false, а затем удаляет GUI с помощью dispose (). но когда я нажимаю кнопку в GUI, GUI закрывается, тогда ничего не происходит. Я прошел через отладчик, и странно, код работает по-разному, используя инструмент отладки. при использовании инструмента отладки GUI остается открытым после нажатия кнопки и загрузки навсегда. Любая помощь будет приветствоваться.

 genData main = new genData();
 main.safeToContinue = false;
 main.running = true;

 while(main.running == true){

        //trigger GUI    
        mainGUI MG = new mainGUI();
        MG.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        MG.setSize(250, 275);
        MG.setVisible(true);

        //wait tell the GUI says its safe to continue
        while(main.safeToContinue == false){
            try {
                TimeUnit.MILLISECONDS.sleep(1);
            } catch (InterruptedException ex) {
                Logger.getLogger(mainGUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        //check if main.subProgram is 1
        if(main.subProgramNumber == 1){
            System.out.println("subProgram = 1");
        }

        //check if main.subProgram is 2
        if(main.subProgramNumber == 2){
           System.out.println("subProgram = 2");
        }


}

ниже - это упрощенная версия моего GUI кода. (извините, это своего рода много кода, но я не мог понять, как сделать его проще, чем этот ...) * использовал (и использую выше)

основную программу (она вызывается при нажатии кнопки «Пуск»):

 varData MC = new varData();
        do{

            MC.safeToContinue = false;

            //open and run the main GUI
            ExerciseMainGUI EM = new ExerciseMainGUI();
            EM.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            EM.setSize(250, 275);
            EM.setVisible(true);

            //System.out.println("debug 1");

            //wait tell the sub program closes to continue
            do{
                hutLib.pause(1);
            }while(MC.safeToContinue==false);

            hutLib.pause(1);

        }while(MC.running == true);

GUI, который я вызываю выше:

public class ExerciseMainGUI extends JFrame{

    private JButton bottlePacker;
    private JButton triangleTester;
    private JButton primeChecker;
    private JButton averager;
    private JButton rollTheDice;
    private JButton close;

    public ExerciseMainGUI(){
        super("Java Exercises");
        setLayout(new FlowLayout());

        bottlePacker = new JButton("   Bottle Packer   ");
        triangleTester = new JButton("  Triangle Tester  ");
        primeChecker = new JButton("   Prime Checker   ");
        averager = new JButton ("Averager (offline)");
        rollTheDice = new JButton("Roll the Dice (offline)");
        close = new JButton("       Close       ");

        add(bottlePacker);
        add(triangleTester);
        add(primeChecker);
        add(averager);
        add(rollTheDice);
        add(close);

        bottlePacker bp = new bottlePacker();
        bottlePacker.addActionListener(bp);

        triangleTester tt = new triangleTester();
        triangleTester.addActionListener(tt);

        primeChecker pc = new primeChecker();
        primeChecker.addActionListener(pc);

        averager a = new averager();
        averager.addActionListener(a);

        rollTheDice rtd = new rollTheDice();
        rollTheDice.addActionListener(rtd);

        close c = new close();
        close.addActionListener(c);
    }

    private class bottlePacker implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            //runs a subprogram

        }
    }

    private class triangleTester implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            //runs a subprogram
        }
    }

    private class primeChecker implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            //runs a subprogram

        }
    }

    private class averager implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            //runs a subprogram

        }
    }

    private class rollTheDice implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            //runs a subprogram

            //JOptionPane.showMessageDialog(null, "NOTE: Roll the Dice will run in the command line.");

            //oldCodeStorage.rollTheDice.rollTheDice();

        }
    }

    private class close implements ActionListener{

        public void actionPerformed(ActionEvent e){
            dispose();
            varData MC = new varData();
            MC.running = false;
            MC.safeToContinue = true;

        }
    }
}

ПРИМЕЧАНИЕ: когда каждая подпрограмма завершена, она запускает следующий код:

varData MC = new varData();
MC.safeToContinue = true;

Я знаю, что это много, но меня явно попросили опубликовать.

Ответы [ 4 ]

2 голосов
/ 22 апреля 2020

Вы неправильно используете компоненты Swing. Вы должны показать свое приложение и реагировать на события через слушателей событий. Для этого не требуется никаких циклов и т. Д. c.

Например,

public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(1, 2));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JButton b1 = new JButton("Action 1");
        JButton b2 = new JButton("Action 2");
        b1.addActionListener((e)->System.out.println("Action 1 taken")); // your subcommand 1 
        b2.addActionListener((e)->System.out.println("Action 2 taken")); //your subcomand 2
        frame.add(b1);
        frame.add(b2);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

Также не забывайте НЕ вызывать дорогостоящие действия в actionListeners, а делегировать их на фоновую работу - это заморозит ваши Пользовательский интерфейс в противном случае. Написание приложения на пользовательском интерфейсе на Swing не так просто, как вы думаете, и требует небольшого набора базовых знаний (относительно самого Swing). Неплохо попробовать, но не ознакомившись с основами Swing, вы попадете в стену десятка миллионов раз - поверьте мне, я был там.

Вы упомянули, что вы новичок в thinging - Swing сам по себе является однопоточным, но он включает в себя многопоточность для выполнения различных задач, которые могут замедлить работу приложения или, в противном случае, сделать его не отвечающим на запросы.

Я настоятельно рекомендую вам начать копаться, например, Oracle руководства по Swing .

https://docs.oracle.com/javase/tutorial/uiswing/index.html

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

Я нашел решение. Переменные, которые я хранил в объекте genData (), должны были иметь статус c.

Спасибо за вашу помощь!

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

Допустим, у нас есть класс.

class GenData{
    static int x = 0;
    int y = 1;
}

Теперь у меня есть два экземпляра этого объекта.

GenData a = new GenData();
GenData b = new GenData();

a.x = 5;
a.y = 10;

System.out.println( b.x + ", " + b.y );

Что вы ожидаете получить на выходе быть?

b имеет свои собственные переменные экземпляра. Поэтому я ожидаю, что результат будет.

5, 1

В вашем коде вы вызываете new genData(), который создает новый экземпляр класса. Если ваше поле не является stati c, то оно не будет передано версии проверяемой genData.

Пожалуйста, также используйте java соглашения об именах. GenData лучше для имени класса.

Как исправить.

public class mainGUI extends JFrame{

    public JButton add;
    public JButton remove;
    public JButton edit;
    public JButton report;
    public JButton close;
    genData main;
    public mainGUI(genData main){
        this.main = main;
        //don't change the rest.
    }

    private class addGuest implements ActionListener{

        public void actionPerformed(ActionEvent e){
            //genData main = new genData();
            //don't call new here, use the reference you 
            //received.
        }
    }

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

Вы вообще не изменяете main.safeToContinue. Вот почему он застрял в этой бесконечности, пока l oop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...