Java 在主类之外使用组件

Java 在主类之外使用组件,java,swing,netbeans,Java,Swing,Netbeans,有没有一种方法可以在该类之外使用在主类(扩展了JFrame)中创建的组件?我使用的是netbeans生成器,我想:textArea.setText(“”) 但是我没有访问main类之外的textArea组件的权限。请确保您已设置: public static JTextArea textArea; 然后你可以做: MainClass.textArea.setText(""); 希望这有帮助 在主类中,确保已设置: public static JTextArea textArea; 然后你可

有没有一种方法可以在该类之外使用在主类(扩展了
JFrame
)中创建的组件?我使用的是netbeans生成器,我想:
textArea.setText(“”)

但是我没有访问main类之外的textArea组件的权限。请确保您已设置:

public static JTextArea textArea;
然后你可以做:

MainClass.textArea.setText("");

希望这有帮助

在主类中,确保已设置:

public static JTextArea textArea;
然后你可以做:

MainClass.textArea.setText("");

希望这有帮助

jtextfield
传递给第二个类的构造函数

public class MainClass {
    private JTextField textField = new JTextField();
    private SecondClass secondClass;

    public MainClass() {
        secondClass = new SecondClass(textField);
    }
}

public class SecondClass {
    private JTextField textField;

    public SecondClass(JTextField textField) {
        this.textField = textField;
    }
}
现在,可以在
SecondClass
中使用来自
main类的相同文本字段,因为它是通过引用传递的



另请参见示例

jtextfield
传递给第二个类的构造函数

public class MainClass {
    private JTextField textField = new JTextField();
    private SecondClass secondClass;

    public MainClass() {
        secondClass = new SecondClass(textField);
    }
}

public class SecondClass {
    private JTextField textField;

    public SecondClass(JTextField textField) {
        this.textField = textField;
    }
}
现在,可以在
SecondClass
中使用来自
main类的相同文本字段,因为它是通过引用传递的



另请参见示例

有两种方法可以做到这一点。一个是具有对对象的公共访问权限(不推荐):

但我建议在主类中提供一个方法,例如:

public void clearTextArea(){
    textArea.setText("");
}
这通常是最好的,因为您提供了对组件的最少访问;您可以确保主类是处理组件的类,而不是其他类

或者,您可以在
MouseListener
类中创建一个构造函数,将文本区域作为参数:

private JTextArea textArea;

public MyMouseListener(JTextArea toChangeOnAction){
    textArea = toChangeOnAction;
}

如果您想使用文本区域中的许多方法,而不必在主类中创建许多方法,那么这种方法就容易多了。

有几种方法可以做到这一点。一个是具有对对象的公共访问权限(不推荐):

但我建议在主类中提供一个方法,例如:

public void clearTextArea(){
    textArea.setText("");
}
这通常是最好的,因为您提供了对组件的最少访问;您可以确保主类是处理组件的类,而不是其他类

或者,您可以在
MouseListener
类中创建一个构造函数,将文本区域作为参数:

private JTextArea textArea;

public MyMouseListener(JTextArea toChangeOnAction){
    textArea = toChangeOnAction;
}

当您希望使用文本区域中的许多方法时,这种方法会更容易,而不必在主类中创建许多方法。

提供一个getter来访问文本区域:

import javax.swing.JFrame;
import javax.swing.JTextArea;
// ...

public class Main extends JFrame {
    private JTextArea textArea;

    private void createUI() {
        // ...
        textArea = new JTextArea();
        // ...
    }

    public JTextArea getTextArea() {
        return textArea;
    }
}

public class Other {
    // ...
    public void update(Main main, String message) {
        main.getTextArea().setText(message);
    }
    // ...
}

提供一个getter来访问文本区域:

import javax.swing.JFrame;
import javax.swing.JTextArea;
// ...

public class Main extends JFrame {
    private JTextArea textArea;

    private void createUI() {
        // ...
        textArea = new JTextArea();
        // ...
    }

    public JTextArea getTextArea() {
        return textArea;
    }
}

public class Other {
    // ...
    public void update(Main main, String message) {
        main.getTextArea().setText(message);
    }
    // ...
}


第二个类到底是什么?好的:D我怎么做?第二个类扩展了JPanel并实现了MouseListener…所以当单击鼠标时,我想textArea.setText(“”)你想实现什么?为什么您需要访问文本区域?@mkkrolik仅供参考…您可以在NetBeans中修改组件内对象,只需将您的
JTextField
公开,并从任何类访问它。第二个类到底是什么?好的:D我怎么做?第二个类扩展了JPanel并实现了MouseListener…所以当单击鼠标时,我想要textArea.setText(“”)你想要实现什么?为什么您需要访问文本区域?@mkkrolik仅供参考…您可以在NetBeans中修改组件内对象,只需将您的
JTextField
公开并从任何类访问它。我不能这样做,因为我使用NetBeans生成器,不能修改组件对象我不能这样做,因为我使用netbeans生成器,无法修改组件对象,所以我仍然认为让
Main
类将
JTextArea
传递到
Other
类是一个更好的主意;这样,就更容易控制谁有权访问文本区域。这是一个很好的观点。但是,我们没有被告知其他类是如何或何时创建的,因此我不想做任何假设。您应该避免暴露textarea本身,因为它使调用方可以直接访问父组件,允许调用者对它执行您确实不希望他们喜欢的操作,删除它或父组件的所有子组件。我仍然认为让
Main
类将
JTextArea
传递到
Other
类是一个更好的主意;这样,就更容易控制谁有权访问文本区域。这是一个很好的观点。但是,我们没有被告知其他类是如何或何时创建的,因此我不想做任何假设。您应该避免暴露textarea本身,因为它使调用方可以直接访问父组件,允许调用者对其执行您确实不希望他们喜欢的操作删除它或父组件的所有子组件挑剔:这会导致组件误用,包括对父组件的访问,允许调用者只对父组件的文本区域执行讨厌的操作。虽然访问者模式不是一个更好的主意,但OP试图实现的更多内容将有助于确定这种方法是否是最好的方法(IMHO;)吹毛求疵:这会导致组件被误用,包括访问父组件,从而允许调用方只在父组件的文本区域内执行一些令人讨厌的操作。虽然访问者模式不是一个更好的主意,但OP试图实现的更多内容将有助于确定这种方法是否是最好的方法(IMHO;)@你指的是上下文:“在主类中提供一个方法”?不,对不起,OP的问题缺乏上下文,所以很难知道什么解决方案可以解决他们的问题problem@MadProgrammer你指的是上下文:“在主类中提供一个方法”?不,对不起,OP的问题缺乏上下文,所以很难知道什么样的解决方案可以解决他们的问题