Как применить метод Getter/Setter для частной переменной в графическом интерфейсе?

Цель этой программы — получить доступ к закрытой переменной jtextfield из другого класса. Я создал эту простую программу, которая принимает пользовательский ввод из JTextField. У меня есть методы получения и установки в одном классе, а кнопка и поле - в другом классе. Поэтому я хочу что-то печатать, когда пользователь что-то вводит в текстовое поле. Но при нажатии кнопки программа не печатает и выдает ошибку:

Ошибка: javax.swing.JTextField[,140,62,124x20,layout=javax.swing.plaf.basic.BasicTextUI

Правильно ли я инициализировал методы получения и установки?

Пример1:

import javax.swing.*;

class Example1 {

private JTextField Name;


public Example1(){

 Name = null;

 }

public Example1(JTextField n){

 Name = n;

 } 


public void setName(JTextField Name) {
    this.Name = Name; 
}
public JTextField getName() {
    return Name;
}

}

Пример2:

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


 public class Example2
{

JFrame frame = new JFrame();
JPanel panel = new JPanel();

private JTextField Name = new JTextField();
private JButton Button = new JButton("Print");


public Example2(){

panel.setLayout(null);  

Name.setBounds(140, 62, 124, 20);
Button.setBounds(320, 62, 133, 20); 

panel.add(Name);  
panel.add(Button);  

frame.add(panel);
frame.setSize(470,310);
frame.setVisible(true);



Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

add(Name);

}
});



}


public static void add(JTextField Name){

Example1 x = new Example1();
x.setName(Name);

JTextField a = x.getName();
System.out.println(a);

}


public static void main(String [] args){

    Example2 print = new Example2();
}



}

person Ramal    schedule 08.03.2013    source источник
comment
В качестве примечания: стандартом в Java является использование lowerCamelCase для переменных-членов.   -  person Clockwork-Muse    schedule 08.03.2013


Ответы (2)


Вы не хотите печатать сам элемент, к которому хотите получить доступ к строке, удерживаемой текстовым полем. Это не ошибка. Он просто вызывает метод toString() для JTextField.

Используйте textfield.getText() для доступа к значению текстового поля. В Примере 2 это будет:

public static void add(JTextField Name){
    Example1 x = new Example1();
    x.setName(Name);

    JTextField a = x.getName();
    System.out.println(a.getText());
}

Надеюсь это поможет.

person F. Müller    schedule 08.03.2013
comment
Хорошо, я попробовал это, и это сработало. Кроме того, как я могу добавить jtextfield в список массивов и использовать цикл для вывода значения? - person Ramal; 08.03.2013
comment
List‹JTextField› textFields = new ArrayList‹JTextField›(); textFields.add(Имя); for(int i = 0;i‹ textFields.size(); i++){ Name[i] = textFields.get(i).getValue(); System.out.println(Имя[i]); } - person Ramal; 08.03.2013
comment
Я всегда делаю так: List‹JTextField› textFields = new ArrayList‹›(); textFields.add(Имя); for (поле JTextField: textFields) { System.out.println(field.get(i).getText()); } Но ваше решение тоже должно работать. Могу я попросить вас принять этот ответ? - person F. Müller; 09.03.2013
comment
Хорошо, спасибо. Что ж, мое решение выдает ошибку Name[i] = textFields.get(i).getValue(); - person Ramal; 09.03.2013
comment
о, я наблюдал это в вашем коде в комментарии - нет функции getValue() ... - person F. Müller; 09.03.2013
comment
Я пробовал fields[i] = textFields.get(i); Имя[i] = textFields.get(i).getValue(); и поле [i] = textFields.get(i); Но нерабочий. - person Ramal; 09.03.2013
comment
потому что функция называется getText()... вы все еще используете getValue() :| - person F. Müller; 09.03.2013

То, что вы видите, не является ошибкой. Это результат печати объекта, для которого не определен метод toString().

JTextField a = x.getName();
System.out.println(a);

Когда вы передаете объект System.out.println(), вызывается этот объект toString(). Поскольку для JTextField нет toString(), вызывается стандартный метод Object.toString().

Лучшим способом было бы:

System.out.println(a.getText());
person Matt Watson    schedule 08.03.2013
comment
JTextField не имеет метода toString(), нет, но в данном случае он наследует его от чего-то другого, кроме Object. Тем не менее, это является причиной проблемы (и хорошим решением). - person Clockwork-Muse; 08.03.2013