我正在尝试在另一个单独的Font Chooser
中创建自己的class
类,该文件位于我拥有主类(JFrame
应用程序)的文件中,我想访问主要JFrame
的 textArea对象,以便修改其字体属性,但我无法做到,因为textArea是一个非静态对象。
为了解决这个问题,我曾想过将单独的类(" Font Chooser")作为内部类。在这个唯一的解决方案?
修改
Font Chooser
对象在创建主框架后被实例化,实际上实例化是由主JFrame类完成的,显然我无法访问主要框架JFrame公共成员。
感谢。
答案 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.
}
}
显然,这需要针对您的代码进行修改,但这就是想法。您需要传递对要修改的对象的引用。