обновление Swing JTextField - PullRequest
       7

обновление Swing JTextField

2 голосов
/ 14 ноября 2011

Я не могу .setText(...) для JTextField вне класса, который создает графический интерфейс. Я очень смущен и чувствую, что чего-то не хватает. Мне нужно немного помощи здесь.

Вот что я делаю:

В классе (называемом MainClass) я создаю экземпляр класса, который создает мой графический интерфейс

TestText gui = new TestText();

с конструктором, который устанавливает настройки по умолчанию (JTextField и кнопка со слушателем). Затем я вызываю сеттер, который я написал, и передаю ему строку, которая должна установить текст JTextField:

gui.setText("new");

Но "new" не отображается в графическом интерфейсе.

Я знаю, что мой сеттер работает из класса, потому что, если я сделаю вызов сеттеру с помощью кнопки, которую я создал в графическом интерфейсе, изменения появятся в графическом интерфейсе.

То, что меня действительно смущает, таково: если я вызываю свой метод getter непосредственно перед моим инструментом, он возвращает старое значение. Затем, если я вызываю метод получения снова после вызова метода установки, он возвращает новое значение, в то время как графический интерфейс продолжает показывать старое значение. Я подумал, что, возможно, он просто не перерисовывает графический интерфейс, поэтому я попробовал все виды перестановок .invalidate(), .validate(), .update() и .repaint(), все из MainClass и изнутри сеттера. Но никто ничего не сделал.

Возможно ли, что у меня есть 2 разных экземпляра графического интерфейса, и я редактирую только один из них?

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

public class TestText {
    private JTextField textField;
    private JButton button;
    private JPanel frame;
    JFrame jFrame;
    public void setText(String text) {
        textField.setText(text);
    }
    public String getText() {
        return textField.getText();
    }
    public TestText() {
        this.textField.setText("98.6");
        this.jFrame = new JFrame("TestText");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setText("new (button)");
            }
        });
    }
    public void setData(TestText data) {
        data.setText("new (setData)");
    }
    public void getData(TestText data) {
    }
    public boolean isModified(TestText data) {
        return false;
    }
    public void createGui(String[] args) {
        jFrame.setContentPane(new TestText().frame);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

и вот основной класс, из которого я пытаюсь создать графический интерфейс:

public class MainClass {

    public static void main(String[] args) {

        TestText gui = new TestText();
        gui.createGui(null);

        System.out.println(gui.getText());
        gui.setData(gui);
        System.out.println(gui.getText());
        gui.setText("new (MainClass)");
        System.out.println(gui.getText());
    }

}

Ответы [ 2 ]

4 голосов
/ 14 ноября 2011

Похоже, вам не хватает ссылки на текстовое поле, я думаю ...

gui.referenceToTextField.setText("new word");

РЕДАКТИРОВАТЬ: Очень хороший SSCCE! Однако есть несколько проблем (не в указанном порядке, обязательно).

  1. Вы переопределяете метод setText(). Не делайте этого, если вы не хотите, чтобы метод делал что-то другое - почему вы хотите сделать это, я понятия не имею.

  2. Вы даже не используете массив args в методе createGui(). Вы можете создавать методы без указания каких-либо параметров / аргументов.

  3. Метод getData() прямо сейчас бесполезен (если бы я был вами, учитывая то, что вы пытаетесь выполнить, я бы полностью удалил этот метод). Исходя из названия метода apt (еще одна полезная вещь), я предполагаю, что вы хотите извлечь данные из текстового поля. Поместите эту строку внутри метода (и измените слово void на String), и вы должны быть установлены!

    return textField.getText();
    
  4. По правде говоря, это даже не должно выполняться из-за исключения NullPointerException. Вы не инициализируете ни один из компонентов, кроме JFrame. Вам нужно сделать что-то вроде textField = new JTextField(20).

  5. Даже если бы вы могли запустить это, кнопка не сработала бы вообще, потому что кнопке не сказали, что она что-то делает. Для этого вызовите button.addActionListener() с именем класса прослушивания в качестве аргумента. Если GUI и классы прослушивания оказываются в одном классе (как я покажу вам через минуту), аргумент будет просто this.

  6. Вы не добавляете какие-либо компоненты во фрейм. Для каждого компонента, который вы хотите поместить в свой фрейм, вы должны позвонить add(Component cmpt).


Сказав это, я думаю, что я просто попытаюсь воссоздать то, что вы пытаетесь сделать здесь, в один класс. Вам на самом деле не нужны два отдельных класса, если часть прослушивания не слишком длинная.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TestText extends JFrame implements ActionListener {
    JTextField textField = new JTextField(20);
    JButton set = new JButton("Set Text");
    JButton get = new JButton("Get Text");

    public TestText() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(textField);
        set.addActionListener(this); //this tells the program that the button actually triggers an event
        add(set);
        get.addActionListener(this);
        add(get);
        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        if (event.getSource() == set) {
            textField.setText(JOptionPane.showInputDialog(null, "Enter a new word for the text field:"));
        } else {
            System.out.println(textField.getText());
        }
    }

    public static void main(String[] args) {
        TestText tt = new TestText();
    }
}
0 голосов
/ 15 ноября 2011

После некоторого чтения я думаю, что это из-за того, что мой код не имеет доступа к ветке рассылки событий, как предложено @camickr. Вот некоторая документация , которая помогла мне решить мою проблему.

...