繁体   English   中英

如何从另一个类更改或分配给私有变量JTextField的值?

[英]How do I Change or Assign a Value to a Private Variable JTextField from another class?

对不起,如果这是另一个愚蠢的愚蠢问题,但我仍然是Java编程语言的新手。

我有3个类: InputClassPreviewClassMainClass

MainClass包含运行程序的main method InputClass包含一个private JTextField输入和JButton设置文本到JTextFieldPreviewClass PreviewClass包含一个私有JTextField用于在InputClass显示输入的文本。

我怎么能这样做(在PreviewClassJTextField赋值) 而不创建InputClass实例 ,然后使用getter-method-like来获取它具有的值,或者, 使InputClassJTextField成为static变量,所以我可以用一些static method访问它?

只是为了向您展示我的观点,这里是代码:

  1. InputClass

      import javax.swing.*; import java.awt.*; import java.awt.event.*; public class InputClass extends JPanel implements ActionListener{ private JTextField inputName; private JButton inputButton; public InputClass() { setLayout(new FlowLayout()); inputName=new JTextField(15); inputButton=new JButton("INPUT"); inputButton.addActionListener(this); add(inputName); add(inputButton); } @Override public void actionPerformed(ActionEvent event) { // How do I change/assign a text to the PreviewClass from here? } } 
  2. PreviewClass

      import javax.swing.*; import java.awt.*; public class PreviewClass extends JPanel{ private JTextField namePreview; public PreviewClass() { setLayout(new FlowLayout()); namePreview=new JTextField(15); namePreview.setEditable(false); add(namePreview); } } 
  3. MainClass

     import javax.swing.*; import java.awt.*; public class MainClass extends JFrame{ private static final int FRAME_WIDTH=250; private static final int FRAME_HEIGHT=150; private static final int FRAME_X_ORIGIN=400; private static final int FRAME_Y_ORIGIN=300; private InputClass inputPanel; private PreviewClass previewPanel; private JTabbedPane tabbedPane; private Container contentPane; public MainClass() { contentPane=getContentPane(); contentPane.setLayout(new BorderLayout()); setTitle("How to Assign Value from Another Class"); setSize(FRAME_WIDTH, FRAME_HEIGHT); setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); inputPanel=new InputClass(); previewPanel=new PreviewClass(); tabbedPane=new JTabbedPane(); tabbedPane.add("Input Name", inputPanel); tabbedPane.add("Preview Name", previewPanel); contentPane.add(tabbedPane, BorderLayout.CENTER); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { MainClass frame=new MainClass(); frame.setVisible(true); } } 

你有许多可能的解决方案,都有利有弊。

如果我遇到这样的问题,我很想创建一个interface来描述可以更改的内容,以及当interface的内部状态发生变化时甚至可能提供事件通知。

然后,我将创建此interface的实例并将其传递给每个类。 那些需要来自它的值的类将读取它们所需的值,如果可用,还会附加某种更改/属性侦听器,以便它们可以监视对interface更改。

需要对interface进行更改的那些类将根据需要进行更改。

随着它的改变, interface将触发更新,让任何正在倾听的人都知道已经进行了更改。

通过这种方式,您可以将每个类分离,并减少其他类的不必要的暴露。

这是MVC范例中的“模型”,描述了观察者模式

你是正确的避免让它静止 - 这是一个坏主意。

这里的解决方案是在创建输入类时将对预览类的引用传递到输入类。

输入类存储该引用,然后在文本字段更改时可以执行preview.inputRecieved(str)

创建inputRecieved方法,然后可以更新JLabel和/或执行任何其他需要的处理。

请注意,这也意味着您可以更改预览窗口的显示方式和组织方式,而无需更改输入窗口。 封装是一个重要的面向对象设计原则。

将previewClass的引用传递给Inputclass的构造函数以设置所需的值。

InputClass

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

public class InputClass extends JPanel implements ActionListener{

    private JTextField inputName;
    private JButton inputButton;

    public InputClass(final PreviewClass perviewClassObj) {
        setLayout(new FlowLayout());

        inputName=new JTextField(15);
        inputButton=new JButton("INPUT");
        inputButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                perviewClassObj.setNamePreview(inputName.getText());
            }
        });

        add(inputName);
        add(inputButton);
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        // How do I change/assign a text to the PreviewClass from here?
    }

}

PreviewClass

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

public class PreviewClass extends JPanel{
    private JTextField namePreview;

    /**
     * @param namePreview the namePreview to set
     */
    public void setNamePreview(String textContent) {
        this.namePreview.setText(textContent);
    }

    public PreviewClass() {
         setLayout(new FlowLayout());

         namePreview=new JTextField(15);
         namePreview.setEditable(false);

         add(namePreview);
    }

}

MainClass

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

public class MainClass extends JFrame{
    private static final int FRAME_WIDTH=250;
    private static final int FRAME_HEIGHT=150;
    private static final int FRAME_X_ORIGIN=400;
    private static final int FRAME_Y_ORIGIN=300;

    private InputClass inputPanel;
    private PreviewClass previewPanel;

    private JTabbedPane tabbedPane;
    private Container contentPane;

    public MainClass() {
        contentPane=getContentPane();
        contentPane.setLayout(new BorderLayout());

        setTitle("How to Assign Value from Another Class");
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN);

        previewPanel=new PreviewClass();
        inputPanel=new InputClass(previewPanel);

        tabbedPane=new JTabbedPane();
        tabbedPane.add("Input Name", inputPanel);
        tabbedPane.add("Preview Name", previewPanel);

        contentPane.add(tabbedPane, BorderLayout.CENTER);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        MainClass frame=new MainClass();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

在InputClass中,访问父JFrame并获取它的预览对象并设置字符串值:

@Override
public void actionPerformed(ActionEvent event) {
    // How do I change/assign a text to the PreviewClass from here?
    ((MainClass)SwingUtilities.getWindowAncestor(this)).getPreviewPanel().setValue(inputName.getText());
}

在PreviewClass中(公开用于更改文本的setter方法):

public void setValue(String s){
    namePreview.setText(s);
}

在MainClass中(公开用于访问Preview面板对象的getter方法):

public PreviewClass getPreviewPanel(){
    return previewPanel;
}

您可以将InputClass设置为abstract类,在实例化时覆盖actionPerformed方法并在PreviewClass创建一个setter:

PreviewClass

public class PreviewClass extends JPanel{

    ...

    public void setNamePreview(String name) {
        inputName.setText(name);
    }
}

InputClass

public abstract class InputClass extends JPanel implements ActionListener{

    private JTextField inputName;
    private JButton inputButton;

    public InputClass() {
        setLayout(new FlowLayout());

        inputName=new JTextField(15);
        inputButton=new JButton("INPUT");
        inputButton.addActionListener(this);

        add(inputName);
        add(inputButton);
    }

    public String getInputNameValue(){
        return inputName.getText();
    }
}

MainClass

    ...

    previewPanel=new PreviewClass();
    inputPanel=new InputClass() {
        @Override
        public void actionPerformed(ActionEvent event) {
             previewPanel.setNamePreview(inputPanel.getInputNameValue());
        }
    };

    ...

暂无
暂无

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

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