我试图在另一个独立的class
中创建我自己的Font Chooser
类,从我有我的主类(JFrame
应用程序)的文件中,我想访问主JFrame
的textArea对象,以修改其字体属性,但我无法做到这一点,因为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.
}
}
显然,这需要修改为您的代码,但这就是思路。您需要向要修改的对象传递一个引用