Powrócenie do poprzedniego JFrame bez kasowania wprowadzonych danych.

2015-01-11 18:33
0

Witam,
Mam następujący problem:
W Javie (NetBeans) tworzę sobie dwa okna (JFrame) o nazwie Okno1, Okno2.

Aby przejść do Okno2 w jButton1 Okno1 wpisuję:

dispose();
Okno2 o2 = new Okno2();
o2.setVisible(true);

Po czym, gdy chcę za pomocą przycisku wrócić do Okna1 wpisuję:

dispose();
Okno1 o1 = new Okno1();
o1.setVisible(true);

Jak powrócić do poprzedniego okna(Okno1), aby były zapamiętane wprowadzone wcześniej dane np. w jTextField1 itp.?

Wiem, że można uzyskać taki efekt za pomocą jednego JFrame a w nim CardLayout > jPanel1, jPanel2. Lecz, to rozwiązanie ma jeden problem - wszystkie Panele mają taki sam rozmiar (niby można przypisać inne wartości po kliknięciu- lecz nie o to w tym chodzi).

Po przejściu do Okno2 mogę pobrać wprowadzone dane z Okno1 jTextField1 poprzez "... .getText()" - lecz po powrocie pole jTextField1 jest już puste.

dodanie znaczników <code class="java"> - @furious programming

edytowany 1x, ostatnio: furious programming, 2015-01-11 20:10
Ostatni raz przypominam o wstawianiu kodu w znaczniki kolorujące składnię; Następnym razem wątek poleci do kosza; - furious programming 2015-01-11 20:10

Pozostało 580 znaków

2015-01-11 18:35
0

przekaż referencję jednego okna do drugiego i zamiast dispose wołaj setVisible(false)

edytowany 1x, ostatnio: garai, 2015-01-11 18:41

Pozostało 580 znaków

2015-01-12 00:04
0

Działa. Tak to ma wyglądać?, czy może jest jakiś lepszy sposób?

//Do klasy Okno1 dopisuję:
       public static String t1;
       private Okno2 o2;

//Do przycisku, który wyświetla Okno2 i zachowuje tekst z jTextField1.
         dispose();
        //setVisible(false);
        o2 = new Okno2();
        o2.setVisible(true);
        t1 = jTextField1.getText();

//Do klasy Okno2 dopisuję:
        private Okno1 o1;

//Przycisk w Okno2, który wyświetla Okno1 z zachowaniem ustawienia pola tekstowego:
        dispose();
        ///setVisible(false);
        o1 = new Okno1();
        o1.setVisible(true);
        Okno1.jTextField1.setText(Okno1.t1);
edytowany 2x, ostatnio: furious programming, 2015-01-12 00:08

Pozostało 580 znaków

2015-01-12 09:41
0

Nie do końca... W tym momencie na event kliknięcia przycisku tworzysz jedno nowe okne, drugie niszczysz. Lepiej by było abyś wcześniej stworzył oba okna a na kliknięcie jedno okno chował a drugie pokazywał

Pozostało 580 znaków

2015-01-12 12:02
0

Czy teraz jest poprawnie?:

// Ustawić w Okno1 jTextField1 jako public static
//Do klasy w Okno1:
        public static String t1;

//Przycisk w Okno1:
        setVisible(false);
        new Okno2().setVisible(true);
        t1 = jTextField1.getText();

//Przycisk w Okno2:
    setVisible(false);
    new Okno1().setVisible(true);
    Okno1.jTextField1.setText(Okno1.t1);
prawie to samo co wcześniej :) daj cały kod to Cię łatwiej naprowadzę :) - garai 2015-01-12 12:08
@controles - tylko dodaj cały kod do TEGO posta, nie do kolejnego (użyj opcji Edytuj); - furious programming 2015-01-12 12:17

Pozostało 580 znaków

2015-01-12 12:34

Tak to mniej więcej powinno wyglądać.

  1. Tworzysz sobie niezależnie dwa okna.
  2. Ustawiasz im referencję na siebie poprzez dopisanie metody setAnotherFrame
  3. Zmieniasz tylko widoczność okien na kliknięcie buttona.

O to Ci chodziło?

public class Okno1 extends javax.swing.JFrame {

    private Okno2 okno2;

    public Okno1() {
        initComponents();
    }

    public void setAnotherFrame(Okno2 okno2){
        this.okno2 = okno2;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTextField1.setText("jTextField1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                        .addGap(136, 136, 136)
                                        .addComponent(jButton1))
                                .addGroup(layout.createSequentialGroup()
                                        .addGap(46, 46, 46)
                                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(170, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGap(62, 62, 62)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(47, 47, 47)
                        .addComponent(jButton1)
                        .addContainerGap(147, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        setVisible(false);
        okno2.setVisible(true);
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    public static javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}
public class Okno2 extends javax.swing.JFrame {

    private Okno1 okno1;

    public Okno2() {
        initComponents();
    }

    public void setAnotherFrame(Okno1 okno1){
        this.okno1 = okno1;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTextField1.setText("jTextField1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGap(104, 104, 104)
                        .addComponent(jButton1)
                        .addContainerGap(202, Short.MAX_VALUE))
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(96, 96, 96))
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGap(70, 70, 70)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(37, 37, 37)
                        .addComponent(jButton1)
                        .addContainerGap(149, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        setVisible(false);
        okno1.setVisible(true);
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {

        final Okno1 okno1 = new Okno1();
        final Okno2 okno2 = new Okno2();

        okno1.setAnotherFrame(okno2);
        okno2.setAnotherFrame(okno1);

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                okno1.setVisible(true);
            }
        });
    }

}
Tak o to chodziło :) Dzięki. Tylko pewnie jakby JFrame było kilkanaście i każda z nich tylko ukryta - to więcej pamięci by było zajętej niż przy użyciu dispose() i kopiowaniu ustawień np. do pliku czy pamięci?. - controles 2015-01-12 12:57
Na tym poziomie nie przejmuj się pamięcią, optymalizować będziesz gdy zajdzie taka potrzeba. Raczej nie tworzy się kilkunastu JFrame a raczej wymienia się JPanele. I można to robić dynamicznie (wtedy będzie niszczył i tworzył nowy obiekt) lub statycznie (podmieniał gotowe panele). Wszytsko zależy w jakim kontekście to robisz - garai 2015-01-12 13:06

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0