如何在多个类中使用JTextField

时间:2014-04-24 21:31:47

标签: java swing jframe jtextfield

我如何跨两个类使用JTextField。例如,从一个类获取整数值并将其显示在另一个类的textField中。从jFrame到JFrame

3 个答案:

答案 0 :(得分:1)

你的问题是:

  

我如何跨两个类使用JTextField。例如,从一个类中获取一个整数值,并将其显示在另一个类的textField中。

我建议你以不同的方式思考这个问题。最好考虑一般性问题:

  

一个对象如何与其他对象共享其数据及其状态?

一个常见且有用的答案是给第一个类,这里​​是包含JTextField的类,getter方法,如果需要setter方法,允许其他类具有检索JTextField状态的能力(或者如果需要甚至改变它)。例如,您可以为GUI类提供类似的方法:

public String getTextFieldText() {
  return textField.getText();
}

然后,您必须确保需要此信息的类具有有效实例到GUI类,即显示 GUI的实例,然后拥有它当需要来自GUI的最新信息时调用此方法。


修改 您已编辑了自己的问题并添加了

  

从jFrame到JFrame

这让我很担心,因为它表明您的程序使用多个JFrame。如果是这样,请重新考虑您的程序设计,因为它需要多个JFrame是不常见的。如果需要显示另一个窗口,通常可以通过显示模态或非模态JDialog来完成。如果它需要改变"观点"这通常使用CardLayout来交换JPanel。


编辑2
有关我所描述的示例,请参阅this answer中的代码。此代码将模式JDialog中的信息传递给启动它的JFrame,并使用我上面提到的技术:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class DialogEg {
   private static void createAndShowGUI() {
      MainPanelGen mainPanelGen = new MainPanelGen();

      JFrame frame = new JFrame("DialogEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanelGen.getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

}

class MainPanelGen {
   private JPanel mainPanel = new JPanel();
   private JTextField field = new JTextField(10);
   private JButton btn = new JButton(new BtnActn());
   private JDialog dialog;
   private DialogPanel dialogPanel = new DialogPanel();

   public MainPanelGen() {
      mainPanel.add(field);
      mainPanel.add(btn);

      field.setEditable(false);
      field.setFocusable(false);
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private class BtnActn extends AbstractAction {
      BtnActn() {
         super("Button");
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         if (dialog == null) {
            Window win = SwingUtilities.getWindowAncestor(mainPanel);
            if (win != null) {
               dialog = new JDialog(win, "My Dialog",
                     Dialog.ModalityType.APPLICATION_MODAL);
               dialog.getContentPane().add(dialogPanel);
               dialog.pack();
               dialog.setLocationRelativeTo(null);
            }
         }
         dialog.setVisible(true); // here the modal dialog takes over
         System.out.println   (dialogPanel.getFieldText());
         field.setText(dialogPanel.getFieldText());
      }
   }
}

class DialogPanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton exitBtn = new JButton(new ExitBtnAxn("Exit"));

   public DialogPanel() {
      add(field);
      add(exitBtn);
   }

   public String getFieldText() {
      return field.getText();
   }

   private class ExitBtnAxn extends AbstractAction {

      public ExitBtnAxn(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         Window win = SwingUtilities.getWindowAncestor(DialogPanel.this);
         if (win != null) {
            win.dispose();
         }

      }

   }

}

模态JDialog中显示的JPanel有一个名为(适当地)field的JTextField字段:

class DialogPanel extends JPanel {
   private JTextField field = new JTextField(10);

并且有一个getter方法允许其他类检查该字段的状态:

public String getFieldText() {
  return field.getText();
}

名为MainPanelGen的主GUI类带有一个名为dialogPanel的DialogPanel类的实例:

class MainPanelGen {
   // .... etc
   private DialogPanel dialogPanel = new DialogPanel();

在主GUI的ActionListener中,创建了一个模态JDialog" lazily",也就是说,如果JDialog变量为null,则创建对话框,然后将实例分配给此变量。 DailogPanel对象放在模态对话框中并显示:

  public void actionPerformed(ActionEvent arg0) {
     if (dialog == null) {
        Window win = SwingUtilities.getWindowAncestor(mainPanel);
        if (win != null) {
           dialog = new JDialog(win, "My Dialog",
                 Dialog.ModalityType.APPLICATION_MODAL);
           dialog.getContentPane().add(dialogPanel);
           dialog.pack();
           dialog.setLocationRelativeTo(null);
        }
     }

由于对话框是模态的,因此主GUI的代码流在显示对话框时会冻结,并且在对话框不再可见之前不会重新启动。因此,我们知道在对话框上调用setVisible(true)之后的所有代码都处于暂停动画状态,并且在对话框处理完毕之前不会重新启动。然后,我们在DialogPanel中查询文本字段的文本,并将它们告诉我们:

     dialog.setVisible(true); // here the modal dialog takes over
     System.out.println   (dialogPanel.getFieldText());
     field.setText(dialogPanel.getFieldText());

答案 1 :(得分:1)

然后嵌套,所以你有一个类,它在实际显示它的那个中得到整数值E.g:

//Note: this is only a rough representation of the concept
//      what I am trying to get across, it wouldn't really
//      work like this

class Displayer{
    ValueGetter valueGetter;
    JTextField textField;

    public Displayer(){
        valueGetter = new ValueGetter();
    }

    public void display(){

        int value = valueGetter.workOutValue();

        textField.setText(value);
    }
}

答案 2 :(得分:0)

即使你能做到这一点,你也不应该这样做。相反,有两个JTextField个共享Integer