Я хочу получить слова в JFrame2, вернуться к JFrame1, а затем перейти к JFrame3 с этими словами. Как мне это сделать?

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

У меня 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 ответа

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();
 }
 });
 }
}


Рекомендация: не используйте 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);
 }


}


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

licensed under cc by-sa 3.0 with attribution.