【问题标题】:Access a public non-static object from another separate class [closed]从另一个单独的类访问公共非静态对象[关闭]
【发布时间】:2014-07-23 15:03:12
【问题描述】:

我正在尝试在另一个单独的class 中创建我自己的Font Chooser 类,该文件来自我的主类(JFrame 应用程序),并且我想访问 textArea 对象 主要JFrame的,为了修改它的字体属性,但是我做不到,因为textArea是一个非静态对象。

为了解决这个问题,我想到了将独立类(“字体选择器”)设为内部类。在这唯一的解决方案?

编辑

Font Chooser对象是在主Frame创建后实例化的,实际上实例化是由主JFrame类完成的,显然我无法访问主JFrame public成员。

谢谢。

【问题讨论】:

  • 您不需要单独的课程。从静态上下文修改非静态值没有任何意义。这就像想把你的车漆成红色,所以你试着改变“汽车”这个抽象概念的颜色。您需要修改汽车的一个实例,而不是整个类。

标签: java swing fonts scope


【解决方案1】:

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

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

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

因此,要调用此方法的对象,它所需要的只是对 MyGui 类的 valid 引用,其中 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);
  }

【讨论】:

  • 好的,但是“字体选择器”类是在创建主 JFrame 之后创建的,显然我无法访问它的公共成员。
  • @bad_alloc:我不明白你的评论。请详细说明,因为创建类的时间与此问题无关。
  • @bad_alloc 这里的建议是您根本不需要单独的 FontChooser 类。只需公开一个方法即可更改内部文本区域的字体。
  • 我想创建自己的字体选择器类
  • @bad_alloc: 这个类有什么作用?显示您的代码或详细描述它。如果你创建了这个类,是什么阻止你传入包含 JTextArea 的类的有效实例?
【解决方案2】:

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

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

【讨论】:

  • 另一个家伙速度更快,但我也要感谢你!!
  • @bad_alloc ♥ 很高兴你解决了问题
  • 今天很累,所以比平时更笨了
猜你喜欢
  • 2013-10-22
  • 2013-02-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2012-09-06
相关资源
最近更新 更多