Как вернуться к JFrames в Java - PullRequest
4 голосов
/ 07 января 2012

У меня есть кнопка в JFrame, при нажатии она переносит нас в другой кадр. Я использовал этот код:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

    SecondForm secondform = new SecondForm();
    secondform.setVisible(true);
    setVisible(false);
    dispose();
    }

Итак, новая рамка открывается и все в порядке. Затем я поместил другую кнопку - во второй кадр - чтобы вернуться к предыдущему кадру. Я использовал этот код:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    MainForm Mform = new MainForm();
    Mform.setVisible(true);
    setVisible(false);
    dispose();
}                                        

Дело в том, что я не думаю, что это правильный способ сделать это. То, что я хочу, это:

  • скрыть первый кадр
  • показать новый второй
  • распоряжаться вторым
  • показать снова первый

Есть ли способ сделать это, используя первый экземпляр MainForm и не создавая новый каждый раз, когда я хочу вернуться назад. Я следил за своей программой, и каждый раз, когда я перемещался вперед и назад по кадрам, и, как я и подозревал, используемый им плунжер продолжает увеличиваться.

Заранее спасибо.

РЕДАКТИРОВАТЬ: У меня есть система входа в систему, и когда пользователь вводит правильные учетные данные, создается новый экземпляр ManiForm.

MainForm Mform = new MainForm();
Mform.setVisible(true);

Это пример, который я хочу использовать. Есть ли способ сделать MForm снова видимым из второй формы?

Прежде всего спасибо за помощь!

Я согласен, что проще не использовать более одного JFrames, но не могли бы вы сказать мне, какой лучший способ сделать то, что я спросил в первом посте? Ответ Робин дал мне очень хороший ответ, но я не знаю, что там аргументировать *:

java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
    *   new SecondForm().setVisible(true);
        }
    });

Это из автоматически сгенерированного кода из NetBeans.

Я пытался

new SecondForm(super).setVisible(true);

но я все еще получаю ошибки компиляции. Очевидно, я должен поставить super.something(), но я не знаю что. Я пробовал много, но не повезло.

Ответы [ 3 ]

9 голосов
/ 07 января 2012

Вы не должны использовать более одного кадра.

У вас не должно быть НИЧЕГО в JFrame, кроме defaultExitOperation, size, preredsize и visible true. Вместо этого поместите все кнопки и поля в JPanel и добавьте / удалите JPanel из JFrame.

Если вы хотите открыть другое окно, используйте JDialog.

Между прочим: вы можете задать для MainFrame значение false и открыть JDialog с вашим MainFrame в качестве родительского. Только если кто-то записывает правильный пароль пользователя +, вы делаете MainFrame видимым.

1 голос
/ 06 февраля 2013

Для приложений Swing стандартом является использование STATIC MAIN FRAME, другими словами, сделать ваш основной кадр (mframe) статичным и добавить методы для всплывающих новых кадров, диалогов, опций и т. Д. Вы даже можете управлять видимость основного кадра броска статических звонков. Таким образом, вы реализуете УНИКАЛЬНЫЙ КАДР для своего приложения, даже если вы создаете экземпляры других кадров для навигации, все дочерние кадры могут ссылаться на основной кадр без необходимости передачи его в качестве параметра конструкторам или создания его новых экземпляров.

Основной класс

`/ * для запуска приложения * /

public class Main{
    public static MainFrame MFRAME;

    public static void main(String[] args){
        /*use this for thread safe*/
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Main.MFRAME = new MainFrame(/*init parms to constructor*/);
            }
        });
    }
}

`

Основная рама

`/ * для создания основного кадра * /

public class MainFrame extends JFrame{

    public MainFrame(/*your constructor parms*/){
        /* constructor implementation */
    }


    public void openOtherFrame(/*your parms*/){
        OtherFrame oFrm = new OtherFrame(/*your parms*/);
    }

    /* other methods implementation */
}

`

Детская рамка

`/ * для открытия дочерних фреймов, контролирующих видимость основного фрейма * /

public class OtherFrame extends JFrame{

    public OtherFrame(/*your constructor parms*/){
        /* hide main frame and show this one*/
        Main.MFRAME.setVisible(false);
        this.setVilible(true);
        /* do something else */
        /* show main frame and dispose this one*/
        Main.MFRAME.setVisible(true);
        this.dispose();
    }

    /* other methods implementation */
}

`

1 голос
/ 07 января 2012

Если вы передадите MainForm в класс SecondForm (например, с помощью параметра конструктора), экземпляр SecondForm может снова сделать видимым исходный экземпляр MainForm вместо создания нового.

Например

public class SecondForm extends JFrame{
 private final MainForm mainForm;
 public SecondForm( MainForm form ){
   mainForm = form;
 }
 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  mainForm.setVisible(true);
  setVisible(false);
  dispose();
 }  
}

и в вашем MainForm классе

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
 SecondForm secondform = new SecondForm( this );
 secondform.setVisible(true);
 setVisible(false);
 dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...