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

时间:2014-07-23 15:03:12

标签: java swing fonts scope

我正在尝试在另一个单独的Font Chooser中创建自己的class类,该文件位于我拥有主类(JFrame应用程序)的文件中,我想访问主要JFrame textArea对象,以便修改其字体属性,但我无法做到,因为textArea是一个非静态对象。

为了解决这个问题,我曾想过将单独的类(" Font Chooser")作为内部类。在这个唯一的解决方案?

修改

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

public class MyGui {
  private JTextArea textarea = .....;

  public void setTextAreaFont(Font font) {
     textarea.setFont(font);
  }

因此,对于调用此方法的对象,它所需要的只是对MyGui类的有效引用,其中 valid 是关键术语。这可能需要您通过setter方法或构造函数参数将引用传递给需要它的对象。这里没有必要使用内部类,完全没有。

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


修改

您现在声明:

  

"字体选择器"在创建主Frame之后实例化对象,实际上实例化是由主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);
  }

答案 1 :(得分:1)

您需要的是引用要修改的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.
    }
}

显然,这需要针对您的代码进行修改,但这就是想法。您需要传递对要修改的对象的引用。