Откройте новое окно JFrame, нажав кнопку в другом окне JFrame. - PullRequest
0 голосов
/ 12 мая 2018

Обновление: в данный момент я решил, что самое простое - использовать отдельные JPane, а не JFrame для подменю. Я создам их все вместе, сделаю остальных невидимыми и переключу таким образом. Меню не настолько сложны, что это будет слишком большой проблемой.

Я создаю графический интерфейс, который открывает другое окно JFrame от нажатия кнопки в другом. Я просто не уверен в правильном подходе к закрытию главного окна при нажатии одной из кнопок, но не к закрытию всей программы. Также я не уверен, как сделать видимым второе окно (строка кода, которую я пробовал из другого примера, не работает). Второй всплывающий фрейм предоставит пользователю варианты действий и фактически вызовет другую программу / класс для запуска по нажатой в нем кнопке (результатом одного из вариантов является длинная программа, поэтому я думаю, что мне нужно запустить это в другой теме.) После завершения работы программы у пользователя будет возможность вернуться в главное меню, которое закроет второе меню (и уничтожит его), или выйдет из программы (и, таким образом, закроет главное меню и все очистит). В главном меню у них также будет возможность закрыть программу, где все будет очищено. Это то, что я до сих пор:

Основной графический интерфейс:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


class GUIMain implements ActionListener {

    GUIMain(){
        JFrame jFrm = new JFrame("Data Mining Application");
        jFrm.setSize(800,600);
        jFrm.setLayout(new BorderLayout());
        jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        prepareGUI(jFrm.getContentPane());
        jFrm.pack();
        jFrm.setVisible(true);

    }

    private void prepareGUI(final Container pane){

        JPanel mainPanel = new JPanel(new GridLayout(3,2,50,50));

        JButton b1 = new JButton("Pre-processing");
        b1.addActionListener(this);
        mainPanel.add(b1);


        pane.add(mainPanel,BorderLayout.CENTER);


    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GUIMain();
            }
        });

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (e.getActionCommand()){
            case "Pre-processing":
                PreProcessingGUI window = new PreProcessingGUI();
                window.getFrame.setVisible(true); //not working
                break;
          // etc
            default:
                break;
        }
    }
}

Класс и JFrame, который называется:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class PreProcessingGUI implements ActionListener {

    PreProcessingGUI(){
        JFrame jFrm = new JFrame("Pre-processing");
        jFrm.setSize(800,600);
        jFrm.setLayout(new BorderLayout());
        jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        prepareGUI(jFrm.getContentPane());
        jFrm.pack();
    }


    private void prepareGUI(final Container pane) {
    //do stuff
    }


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    PreProcessingGUI window = new PreProcessingGUI();

                    // Not surewhat to do here either as the program is not recognising the getFrame method
                    //window.getFrame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    // do stuff
    }
}

1 Ответ

0 голосов
/ 12 мая 2018

Ну, я мало работаю с Swing, но могу вам немного помочь:

Когда вы пытаетесь показать второе окно в GUIMain.actionPerformed, вы, похоже, пытаетесь получить кадр с публичной переменнойимеющий метод (getFrame).

window.getFrame.setVisible(true);

Эта переменная не существует!Это нигде не определено.Здесь нет никакой магии!

Вы должны реализовать getFrame() метод в PreProcessingGUI и использовать его вместо своей переменной.

В GUIMain.actionPerformed:

window.getFrame().setVisible(true);

В PreProcessingGUI

public class PreProcessingGUI implements ActionListener {
    private JFrame jFrm; //You asssing is as you the constructor
    PreProcessingGUI(){
        jFrm = new JFrame("Pre-processing");
        ...
    }
    public getFrame(){
        return jFrm;
    }
...

В дополнение к этому, я бы сказал, что вам следует рассмотреть возможность использования JDialog (и, возможно, сделать его модальным) вместоJFrame.

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