繁体   English   中英

如何将JTextField从JFrame传递到另一个JFrame?

[英]How to pass JTextField from JFrame into another JFrame?

我有两个JFrame(JFrame1和JFrame2)以及两个JTextField1和JTextField2。 我的问题是,当我在Jframe2的JTextField2上编写“ Hello world”,然后单击“确定”按钮时,在Jframe1类的JTextField1上看到“ Hello world”。

我怎样才能做到这一点? 如果这是一个新手问题,很抱歉,但是我正在学习..

这是我的代码:

JFrame2:

private JFrame1 jf1;
private void btn2ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    jf1.setjTextField1(this.jTextField2);
} 

您在那里所做的实际上是将对实际JTextField的引用从一帧发送到另一帧。

这可能不是一个好主意,因为两个框架最终都将引用同一视觉组件。

您可能想要的是将所有可视组件都分开,但要使第二个文本字段的文本等于第一个文本字段的文本。

像这样:

private void btn2ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    jf1.getjTextField1().setText(this.jTextField2.getText());
} 

这是我刚刚编写的一个完整的工作示例:

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

class FrameRunner
{
    public static void main(String[] args){
        MyFrame f1 = new MyFrame("Frame 1");
        MyFrame f2 = new MyFrame("Frame 2");

        f1.addRef(f2);
        f2.addRef(f1);                  
    }       
}

class MyFrame extends JFrame{

    JTextField txt = new JTextField(8);
    JButton btn = new JButton("Send");
    MyFrame f = null;   

    public MyFrame(String title){
        super(title);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(400, 300));
        setVisible(true);
        add(btn);
        add(txt);
        pack();
        setLocationRelativeTo(null);
        init();         
    }

    public void addRef(MyFrame f){
        this.f = f; 
    }

    public void init(){
        btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                f.update(txt.getText());
            }
        });     
    }

    public void update(String str){
        txt.setText(str);
    }   
}

为了使代码简短易懂。 我没有遵循约定的许多事情,也没有对代码进行模块化。 但这应该使您对如何传递另一个JFrame的引用有一个很好的了解。

此代码显示了Frame1如何在Frame2上具有引用的Frame2 但是Frame2Frame1上也有一个引用。

您在JFrame1键入的JFrame1都可以发送到JFrame2's textfield 反之亦然。

您可以使用观察者模式生产者/消费者模式来解决该问题。

基本思想是,您有一些生成值的东西,或者想要被通知或使用生成的值的东西。

您应该花时间学习的其他原则之一也是接口代码(不是实现) 听起来似乎很奇怪,但是其想法是减少对象的不必要暴露(意外/受控的修改)并解耦代码,因此您可以更改基础实现,而不会影响依赖于它的任何其他代码

考虑到问题的性质,观察者模式可能更合适。 Swing的大多数听众都基于相同的原理。

我们首先定义“生成器”将用于提供更改通知的合同...

public interface TextGeneratorObserver {

    public void textGenerated(String text);
}

很简单 这意味着我们可以安全地将任何实现该interface对象的实例提供给生成器,并且知道它不会对我们的对象做任何事情,因为它唯一了解的就是textGenerated方法。

接下来,我们需要一些东西来生成我们正在等待的输出...

public class GeneratorPane extends JPanel {

    private TextGeneratorObserver observer;
    private JTextField field;
    private JButton button;

    public GeneratorPane(TextGeneratorObserver observer) {
        this.observer = observer;

        field = new JTextField(10);
        button = new JButton("OK");

        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                observer.textGenerated(field.getText());
            }
        };

        button.addActionListener(listener);
        field.addActionListener(listener);

        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = GridBagConstraints.REMAINDER;
        gbc.insets = new Insets(2, 2, 2, 2);

        add(field, gbc);
        add(button, gbc);
    }

}

这只是一个简单的JPanel ,但是它要求您将TextGeneratorObserver实例TextGeneratorObserver给它。 当按钮(或字段)触发ActionListenerActionListener调用textGenerated通知观察者该文本已生成或已更改

现在,我们需要有人来观察它...

public class ObserverPanel extends JPanel implements TextGeneratorObserver {

    private JLabel label;

    public ObserverPanel() {
        label = new JLabel("...");
        add(label);
    }

    @Override
    public void textGenerated(String text) {
        label.setText(text);
    }

}

这是一个简单的JPanel ,实现了TextGeneratorObserver interface并使用新文本更新了它的JLabel

然后,我们只需要一起研究

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                ObserverPanel op = new ObserverPanel();
                op.setBorder(new CompoundBorder(new LineBorder(Color.RED), new EmptyBorder(10, 10, 10, 10)));
                GeneratorPane pp = new GeneratorPane(op);
                pp.setBorder(new CompoundBorder(new LineBorder(Color.GREEN), new EmptyBorder(10, 10, 10, 10)));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(2, 1));
                frame.add(pp);
                frame.add(op);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

观察者

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM