Я хочу получить слова в JFrame2, вернуться к JFrame1 и затем перейти к JFrame3 с этими словами. Как мне это сделать? - PullRequest
0 голосов
/ 22 ноября 2011

Ну, у меня сейчас проблема новичка.

У меня есть 3 JFrames. JFrame1 открывает JFrame2; JFrame2 получает слова и затем снова открывает JFrame1; JFrame1 открывает JFrame3 со словами, взятыми в JFrame2 .

У меня проблема с созданием JFrame3. Я имею в виду, я знаю, как перейти от JFrame2 напрямую к JFrame3 (через конструктор, передавая по параметрам слова, которые я нашел). Я пытаюсь взять слова из JFrame2 , , поместить их в JFrame3 , но сделать этот последний невидимым (this.setVisible (false) ). И затем, , когда я возвращаюсь к JFrame1 , и когда я нажимаю кнопку , он перенаправляет меня в JFrame3 со словами из JFrame2 . Что я думаю, что это будет что-то вроде [...]. SetVisible (true).

Чего я не хочу, так это создавать новый JFrame3 (), когда я нажимаю кнопку на JFrame1. Потому что при этом я потеряю все, что получил в JFrame2. В общем, я просто хочу снова сделать JFrame3 видимым. Без необходимости создавать новый и потерять все мои вещи.

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

Кстати, я использую Netbeans-Java .

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Рекомендация: не используйте NetBeans для генерации кода Swing, так как он на самом деле мешает вам изучать Swing и прививает вас к вредным привычкам, таким как нежелательное использование JFrames.Изучите уроки, как программировать Swing вручную.Затем получите ваши слова, возможно, в диалоговом окне, таком как предоставляемое JOptionPane или JDialog, или, возможно, поменяв местами JPanels с CardLayout.

Если вы используете модальные диалоги, вы узнаете, когда один диалог завершится, поскольку код будетвозобновить сразу после того, как диалог был сделан видимым.Затем вы можете запросить у диалогового класса полученные данные.В противном случае, если вы продолжите использовать JFrames, вам нужно будет добавить WindowListeners к фреймам, чтобы знать, когда они стали невидимыми, что немного сложнее сделать.

Например,

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

public class FrameFoolery {
   private static void createAndShowGui() {
      JFrame frame = new JFrame("Frame Foolery");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new MainPanel(frame));
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class MainPanel extends JPanel {
   private String words = "";
   private JDialog dialog1;
   private JDialog dialog2;
   private Panel1 panel1;
   private Panel1 panel2;

   public MainPanel(final JFrame frame) {
      add(new JButton(new AbstractAction("Show Dialog 1") {
         public void actionPerformed(ActionEvent ae) {
            if (panel1 == null) {
               panel1 = new Panel1();
               dialog1 = new JDialog(frame, "Dialog 1", true);
               dialog1.getContentPane().add(panel1);
               dialog1.pack();
               Point pt = frame.getLocation();
               dialog1.setLocation(pt.x - 100, pt.y - 100);
            }
            dialog1.setVisible(true);
            words = panel1.getWords();
         }
      }));
      add(new JButton(new AbstractAction("Show Dialog 2") {
         public void actionPerformed(ActionEvent ae) {
            if (panel2 == null) {
               panel2 = new Panel1();
               dialog2 = new JDialog(frame, "Dialog 2", true);
               dialog2.getContentPane().add(panel2);
               dialog2.pack();
               dialog2.setLocationRelativeTo(frame);
               Point pt = frame.getLocation();
               dialog2.setLocation(pt.x + 100, pt.y + 100);
            }
            panel2.setWords(words);
            dialog2.setVisible(true);
         }
      }));
   }
}

class Panel1 extends JPanel {
   private JTextField wordsField = new JTextField(20);

   Panel1() {
      add(new JLabel("Words:"));
      add(wordsField);
      add(new JButton(new AbstractAction("OK") {
         public void actionPerformed(ActionEvent e) {
            Window win = SwingUtilities.getWindowAncestor(Panel1.this);
            win.setVisible(false);
         }
      }));
   }

   public String getWords() {
      return wordsField.getText();
   }

   public void setWords(String words) {
      wordsField.setText(words);
   }


}
1 голос
/ 22 ноября 2011

JFrame1 открывает JFrame2; JFrame2 получает слова, а затем снова открывает JFrame1; JFrame1 открывает JFrame3 со словами, взятыми в JFrame2.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MultiFrames implements ActionListener
{
    private JFrame frame1, frame2, frame3;
    private String message;
    private JTextField txtFiled;
    private JButton btn1, btn2;
    private JLabel lbl;
    private boolean flag = false;

    private static final String BUTTON1_COMMAND = "btn1";
    private static final String BUTTON2_COMMAND = "btn2";

    public MultiFrames()
    {
        frame1 = new JFrame("JFrame #1");
        frame2 = new JFrame("JFrame #2");
        frame3 = new JFrame("JFrame #3");

        frame1.setLayout(new FlowLayout());
        frame2.setLayout(new FlowLayout());
        frame3.setLayout(new FlowLayout());

        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(200, 100);
        frame1.setLocationRelativeTo(null);

        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame2.setSize(200, 100);
        frame2.setLocationRelativeTo(null);

        frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame3.setSize(200, 100);
        frame3.setLocationRelativeTo(null);

        txtFiled = new JTextField(10);
        frame2.add(txtFiled);

        lbl = new JLabel();
        frame3.add(lbl);

        btn1 = new JButton("Open JFrame #2");
        btn2 = new JButton("Re-Open JFrame #1");

        btn1.addActionListener(this);
        btn1.setActionCommand(BUTTON1_COMMAND);
        btn2.addActionListener(this);
        btn2.setActionCommand(BUTTON2_COMMAND);

        frame1.add(btn1);
        frame2.add(btn2);

        frame1.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        String s = e.getActionCommand();

        if(s.equals(BUTTON1_COMMAND))
        {
            if(!flag)
            {
                frame1.setVisible(false);
                frame2.setVisible(true);
                flag = true;
            }
            else
            {
                frame1.setVisible(false);
                frame3.setVisible(true);
                lbl.setText("The word is: " + message);
            }
        }
        else if(s.equals(BUTTON2_COMMAND))
        {
            frame2.setVisible(false);
            frame1.setVisible(true);
            message = txtFiled.getText();
            btn1.setText("Open JFrame #3");
        }
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new MultiFrames();
            }
        });
    }
}
1 голос
/ 22 ноября 2011

Я не уверен, есть ли у вас причина иметь три отдельных JFrames, но если нет, попробуйте заглянуть в CardLayout LayoutManager Вместо создания отдельных JFrames вы должны создать отдельные JPanels и просто добавить их в этот CardLayout. CardLayout в API

...