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

时间:2013-12-17 09:37:23

标签: java swing jpanel

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

我有3个课程:InputClassPreviewClassMainClass

MainClass包含运行该程序的main methodInputClass包含private JTextField输入和JButton,用于将文本设置为JTextField中的PreviewClassPreviewClass包含一个私人JTextField,可在InputClass中显示输入的文字。

我究竟能做到这一点(在[{1}}中为JTextField分配值) 创建PreviewClass实例然后使用InputClass获取其拥有的值,或者getter-method-like JTextField变量中生成InputClass,以便我可以访问它有些static

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

  1. InputClass

    static method
  2. PreviewClass

     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?
         }
    
     }
    
  3. MainClass

     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);
         }
    
     }
    

5 个答案:

答案 0 :(得分:2)

您有任何可能的解决方案,都有利有弊。

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

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

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

当它发生变化时,interface会触发更新,让任何正在倾听的人知道已经进行了更改。

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

这是MVC范例中的“模型”,描述了observer pattern

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

将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);
    }
}

答案 3 :(得分:0)

在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;
}

答案 4 :(得分:0)

您可以设置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());
        }
    };

    ...