如何从另一个类访问和更改JTextArea

时间:2012-06-11 14:09:14

标签: java swing oop class jtextarea

我已经在PHP和其他Web编程语言中编程了很长时间,但我真的很喜欢Java。当我在PHP编程时使用过程方法时,我对OOP也很新。现在我正在学习一门非常基础的Java教程。

我有这个代码用于显示不同的“银行账户”:

public class UseAccount extends JFrame {

public static void main(String[] args) {

    Account myAccount = new Account();
    Account yourAccount = new Account();

    myAccount.name = "Jimmy";  
    myAccount.address = "Arjeplogsvägen 1";
    myAccount.balance = 1250.70;

    yourAccount.name = "Greg Giraldo";
    yourAccount.address = "Fishermans friend's 4";
    yourAccount.balance = -5820.30;

    myAccount.display();
    System.out.println();
    yourAccount.display();
}
}

以下是“帐户”类:

public class Account{
    String name;
    String address;
    double balance;

    void display() {
        System.out.print(name);
        System.out.print(" (");
        System.out.print(address);
        System.out.print(") has $");
        System.out.print(balance);
    }     
}

这非常有效。但现在我想将此信息输出到JTextArea。所以我已经为UseAccount类编写了这段代码:

import java.awt.*;
import javax.swing.*;

public class UseAccount extends JFrame {
        JTextArea output = new JTextArea();

    public UseAccount() {
        setLayout(new BorderLayout());
        add(output, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
    UseAccount frame = new UseAccount();
    frame.setTitle("Account");
    frame.setSize(500,400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    Account myAccount = new Account();
    Account yourAccount = new Account();

    myAccount.name = "Jimmy";  
    myAccount.address = "Arjeplogsvägen 1";
    myAccount.balance = 1250.70;

    yourAccount.name = "Greg Giraldo";
    yourAccount.address = "Fishermans friend's 4";
    yourAccount.balance = -5820.30;

    myAccount.display();
    System.out.println();
    yourAccount.display();
    }
}

然后我试图让“Account”类扩展“UseAccount”类,然后使用output.append(“the_text”)来显示文本。但这显然不起作用:

public class Account extends UseAccount{
    String name;
    String address;
    double balance;

    void display() {
        output.append(name);
        output.append(" (");
        output.append(address);
        System.out.print(") has $");
        System.out.print(balance);
    }     
}

我没有将每个system.out.print()更改为output.append,因为它无论如何都没有。

我想知道如何从其他课程中访问和更改我的textarea(“输出”)的文本?

我希望有人能够帮助我解决这个小问题。

我知道之前已经提到了类似的问题。我试图查看解决问题的解决方案。但是大多数其他问题对我来说太复杂了,无法理解它的全部内容。因此,我现在尝试发布我自己的问题。

3 个答案:

答案 0 :(得分:2)

继承不是一切的答案,而这里的答案是 。继承应该模仿“is-a”,而不是想象力的延伸是AccountUseAccount

相反,只需更改display()的签名即可将JTextArea作为参数;然后在display()代码中,您将有一个JTextArea来使用。致电display()时,请传递JTextArea

换句话说:

void display(JTextArea ta) {
    ta.append(name);
    ...

然后

// "frame" is the UseAccount object that contains the JTextArea variable `output`
myAccount.display(frame.output);

大多数时候,正确的问题不是“X如何能够访问Y的一部分”,而是“Y如何能够访问X的一部分?”

最后一点注意:为命名变量付出的努力确实很有成效。

答案 1 :(得分:2)

Account类应该更符合。

public class Account extends UseAccount{
    String name;
    String address;
    double balance;

    @Override
    public String toString() {
        return name + 
          " (" +
          address +
          ") has $" + 
          balance;
    }     
}

通过覆盖toString(),我们可以简单地执行以下操作:

Account account = //...
System.out.println(account);
output.setText(account.toString());

答案 2 :(得分:1)

在阅读之前的答案时,我正在考虑另一种方法(不是很不一样):

-class Account提供将放置在TextArea

上的文本

- 框架获取该文本并将其放置在TextArea

在您需要的课程帐户

public class Account {
    String name;
    String address;
    double balance;

    public String toString() {
        return name + address + balance; // This string should follow your desired format
    }     
}

在框架中:

...
output.append(account.toString())
...