从另一个单独的类访问公共非静态对象



我试图在另一个独立的class中创建我自己的Font Chooser类,从我有我的主类(JFrame应用程序)的文件中,我想访问主JFrametextArea对象,以修改其字体属性,但我无法做到这一点,因为textArea是一个非静态对象。

为了解决这个问题,我想让单独的类("字体选择器")一个内部类。这是唯一的解决方案吗?

编辑

Font Chooser对象在创建主框架之后被实例化,实际上实例化是由主JFrame类完成的,显然I 不能访问主JFrame的公共成员。

谢谢。

我的主要建议是:不要忽视解决问题的OOP实践,例如使用公共字段等。不要让另一个类直接操作JTextArea的状态,因为它应该是私有的。相反,为持有JTextArea的类提供一个公共setFont方法,其他类可以在包含类的有效实例上调用该方法。

public class MyGui {
  private JTextArea textarea = .....;
  public void setTextAreaFont(Font font) {
     textarea.setFont(font);
  }

所以一个对象要调用这个方法,它所需要的只是一个对MyGui类的有效的引用,有效的是这里的关键术语。这可能需要通过setter方法或构造函数参数将引用传递给需要它的对象。这里不需要使用内部类,根本不需要。

当然,JTextArea字段永远不应该是静态的,因为那样会把所有的OOP都扔到风中,使维护、增强或测试代码变得非常困难。


编辑

你现在的状态:

"Font Chooser"对象是在主框架创建之后实例化的,实际上实例化是由主JFrame类完成的,显然我不能访问主JFrame公共成员。

那么是什么阻止您在创建时将GUI类传递到字体选择器中呢?

MyFontChooser myFontChooser = new MyFontChooser(this); // ???

请再说一遍你的问题的细节。

class MyFontChooser {
  private MyGui myGui;
  public MyFontChooser(MyGui myGui) {
    this.myGui = myGui;
  }
  // some event caused method
  public void changeFont() {
    myGui.setTextAreaFont(someFont);
  }

您需要的是要修改的JFrame的引用。我假设你的代码看起来像这样:

class MyFrame extends JFrame{
    public JTextArea textArea = new JTextArea();
    public MyFrame(){
        super();
        FontChooser fc = new FontChooser();
        fc.applyFont();
    }
}
class FontChooser{
    public void applyFont(){
        Font f;
        //code to set font values
        MyFrame.textArea.setFont(f);//Won't work, because textArea isn't static
    }
}

你需要的是这样的东西

class MyFrame extends JFrame{
    public JTextArea textArea = new JTextArea();
    public MyFrame(){
        super();
        fc.applyFont(textArea)
    }
}
class FontChooser{
    public void applyFont(JTextArea textArea){//Notice the added parameter
        Font f;
        //code to set font values
        textArea.setFont(f);//Will work, because we have an instance of the object we want to modify.
    }
}

显然,这需要修改为您的代码,但这就是思路。您需要向要修改的对象传递一个引用

最新更新