Reputation: 667
I've been programming for quite a long time in PHP and other web programming languages but I'm really new to Java. And as I've been using a procedural approach when programming in PHP I'm quite new to OOP as well. Now I'm following a very basic Java tutorial.
I have this code for displaying to different "bank accounts":
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();
}
}
And here is the "Account" class:
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);
}
}
This works really well. but now I want to output this information to a JTextArea. So I've written this code for the UseAccount class:
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();
}
}
And then I was trying to make the "Account" class extend the "UseAccount" class and then use output.append("the_text") for displaying the text. But this obviously doesn't work:
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);
}
}
I did not change every system.out.print() to output.append as it isn't working anyway.
I'm wondering how to access and change the text of my textarea("output") from this other class?
I hope someone will be able to help me with this little problem.
I do know that similiar questions have been asked here earlier. And I have tried to look at the solutions given to those questions to solve my problem. But most of the other questions have been too complicated for me to understand what it was all about. Therefore I now try to post my own question.
Upvotes: 1
Views: 7044
Reputation: 81674
Inheritance is not the answer to everything, and here is is not the answer at all. Inheritance should model "is-a", and by no stretch of the imagination is an Account
a UseAccount
.
Instead, just change the signature of display()
to take a JTextArea
as an argument; then in the display()
code you'll have a JTextArea
to work with. When you call display()
, pass the JTextArea
in.
In other words:
void display(JTextArea ta) {
ta.append(name);
...
and then
// "frame" is the UseAccount object that contains the JTextArea variable `output`
myAccount.display(frame.output);
Most of the time, the right question is not "How can X get access to part of Y", but rather "How can Y give access to part of itself to X?"
One final note: small effort put into naming variables well really pays off.
Upvotes: 2
Reputation: 1599
While reading previous answers I was thinking about another approach (not very different):
-class Account provides the text that will be placed on the TextArea
-The frame gets that text and places it in the TextArea
In the class Account you need
public class Account {
String name;
String address;
double balance;
public String toString() {
return name + address + balance; // This string should follow your desired format
}
}
And in the frame:
...
output.append(account.toString())
...
Upvotes: 1
Reputation: 168815
The Account
class should probably be more along the lines of.
public class Account extends UseAccount{
String name;
String address;
double balance;
@Override
public String toString() {
return name +
" (" +
address +
") has $" +
balance;
}
}
By overriding toString()
we can simply do things like:
Account account = //...
System.out.println(account);
output.setText(account.toString());
Upvotes: 2