在JFrame之间传递值

时间:2011-08-10 20:06:22

标签: java swing jframe

我有两个Jframe,其中frame1有一些文本字段,当点击frame1上的一个按钮时,我打开另一个JFrame,其中包含一个搜索框和一个包含搜索结果的JTable。

当我点击JTable上的结果行时,我希望特定值反映在frame1文本字段中。

我尝试将JFrame1的对象作为参数传递但我对如何实现这一点并不清楚。 任何帮助将受到高度赞赏。 感谢

1 个答案:

答案 0 :(得分:29)

首先,你的程序设计似乎有些偏差,好像你正在为你的一个窗口使用JFrame,你实际上应该使用JDialog,因为它听起来好像一个窗口应该依赖于另一个窗口。

但无论如何,您传递GUI对象的引用与标准的非GUI Java代码相同。如果一个窗口打开另一个窗口(第二个窗口通常是对话框),则第一个窗口通常已经保存了对第二个窗口的引用,并且可以调用其中的方法。关键通常是让第一个窗口调用第二个窗口来获取其状态时。如果第二个是模态对话框,那么when很容易 - 在对话框返回后立即将您设置第二个对话框后立即显示在代码中。如果它不是模态对话框,那么您可能希望使用某种类型的侦听器来知道何时提取信息。

话虽如此,详细信息将取决于您的计划结构,如果您需要更具体的帮助,您需要告诉我们更多相关信息。

对于一个打开另一个窗口的简单示例,允许用户在对话框窗口JTextField中输入文本,然后将文本放在第一个窗口的JTextField中,请看一下:

import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class WindowCommunication {

   private static void createAndShowUI() {
      JFrame frame = new JFrame("WindowCommunication");
      frame.getContentPane().add(new MyFramePanel());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   // let's be sure to start Swing on the Swing event thread
   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class MyFramePanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton openDialogeBtn = new JButton("Open Dialog");

   // here my main gui has a reference to the JDialog and to the
   // MyDialogPanel which is displayed in the JDialog
   private MyDialogPanel dialogPanel = new MyDialogPanel();
   private JDialog dialog;

   public MyFramePanel() {
      openDialogeBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            openTableAction();
         }
      });
      field.setEditable(false);
      field.setFocusable(false);

      add(field);
      add(openDialogeBtn);
   }

   private void openTableAction() {
      // lazy creation of the JDialog
      if (dialog == null) {
         Window win = SwingUtilities.getWindowAncestor(this);
         if (win != null) {
            dialog = new JDialog(win, "My Dialog",
                     ModalityType.APPLICATION_MODAL);
            dialog.getContentPane().add(dialogPanel);
            dialog.pack();
            dialog.setLocationRelativeTo(null);
         }
      }
      dialog.setVisible(true); // here the modal dialog takes over

      // this line starts *after* the modal dialog has been disposed
      // **** here's the key where I get the String from JTextField in the GUI held
      // by the JDialog and put it into this GUI's JTextField.
      field.setText(dialogPanel.getFieldText());
   }
}

class MyDialogPanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton okButton = new JButton("OK");

   public MyDialogPanel() {
      okButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            okButtonAction();
         }
      });
      add(field);
      add(okButton);
   }

   // to allow outside classes to get the text held by the JTextField
   public String getFieldText() {
      return field.getText();
   }

   // This button's action is simply to dispose of the JDialog.
   private void okButtonAction() {
      // win is here the JDialog that holds this JPanel, but it could be a JFrame or 
      // any other top-level container that is holding this JPanel
      Window win = SwingUtilities.getWindowAncestor(this);
      if (win != null) {
         win.dispose();
      }
   }
}

你可以采用一种非常类似的方法从JTable中获取信息。

同样,如果此信息对您没有帮助,请告诉我们您的计划的更多信息,包括向我们展示您的一些代码。要展示的最佳代码是一个小的可编辑示例,SSCCE类似于我上面发布的内容。