在JFrame之间传递值

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

当我点击JTable上的一个结果行时,我想要将这些特定的值反映在frame1文本字段中。

我尝试传递JFrame1的对象作为参数,但我不知道如何实现这一目标。 任何帮助将不胜感激。 谢谢

首先,你的程序devise看起来有点偏离,就好像你正在使用一个JFrame作为一个窗口,你实际上应该使用一个JDialog,因为它听起来好像一个窗口应该依赖于另一个窗口。

但是,无论如何,您都可以像传统的非GUI Java代码那样传递GUI对象的引用。 如果一个窗口打开另一个窗口(第二个窗口通常是对话框),那么第一个窗口通常已经存在对第二个窗口的引用,并且可以调用closures它的方法。 关键经常是什么时候让第一个窗口调用第二个方法来获得它的状态。 如果第二个对话框是模式对话框,那么这个对话框很容易 – 在对话框返回之后立即将第二个对话框设置为可见状态。 如果不是modal dialog,那么您可能想要使用某种types的侦听器来知道何时提取信息。

话虽如此,细节将取决于您的程序结构,如果您需要更具体的帮助,您需要告诉我们更多的信息。

对于一个打开另一个窗口的简单示例,允许用户将文本input到对话框窗口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类似于我上面发布的。