【问题标题】:Can't change the JTextField text无法更改 JTextField 文本
【发布时间】:2016-05-13 20:49:26
【问题描述】:

我通常用 C# 编写代码,我什至用 C# 完成了应用程序,但我需要将它移植到 Java。

今天刚开始,之前没真正用过Java。

这个问题很奇怪,因为我没有收到任何错误,它只是没有更新,这里是代码:

public void setInfoStrip(String infoStrip) {
    InfoStrip.setText(infoStrip);
}

上面是一个应该更新 JTextField 的 Setter(如果我使用按钮的 ActionListener 更新它,它会更新它),但是当我在类中甚至在 main(String [] args) 使用此代码的应用程序入口点:

mainGUI GUI = new mainGUI();
GUI.setInfoStrip("test");

或此代码:

new mainGUI().setInfoStrip("test");

我的猜测是它什么都不做,因为我从静态类调用它

public static void main(String[] args)

但是,即使我创建了一个非静态的新类并从公共 staitc void main(String[] args) 引用它,然后放任一

mainGUI GUI = new mainGUI();
GUI.setInfoStrip("test");

new mainGUI().setInfoStrip("test");

它是新创建的类,我称之为

new ImGoingToCry().Alot();

它仍然什么都不做。

我很困惑,我什至在谷歌上阅读了一些与此相关的问题,但它们都被这个解决了:

mainGUI GUI = new mainGUI();
GUI.setInfoStrip("test");

这是你们中的一些人要求的 MVCE:

public class mainGUI {
// GUI Elements
private JPanel WorkSpace;
private JTabbedPane tabbedPane1;
private JList DetectedProfiles;
private JButton StartGame;
private JTextField CurProf;
private JButton BackupProfiles;
private JButton SearchSaves;
private JButton RetrieveProfiles;
private JTextField InfoStrip;
private JLabel ProfileSize;

/**
 * Getter and Setter functions
 */
public void setInfoStrip(String infoStrip) {
    InfoStrip.setText(infoStrip);
}


// Initialize the main application GUI and set it's properties
public static void main(String[] args) {
    JFrame mainGUIFrame = new JFrame("The Witcher 3 Save Manager | " + " ver. "  + GlobalVariables.appversion);
    mainGUIFrame.setContentPane(new mainGUI().WorkSpace);
    mainGUIFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainGUIFrame.setLocationRelativeTo(null);
    mainGUIFrame.setPreferredSize(new Dimension(420, 370));
    mainGUIFrame.setResizable(false);
    mainGUIFrame.pack();
    mainGUIFrame.setVisible(true);
    new mainGUI().run();
}


public void run() {
    /**
     * Initialize the core application functions
     */
    // Load the application settings
    GlobalVariables.Settings();
    // Initialize the app components
    GlobalVariables.Initialize();

    // Pass the value to setter
    new mainGUI().setInfoStrip("test"); // This should change the text but it does nothing there's not even an error
}
}

【问题讨论】:

  • 请发布MVCE(最小、完整且可验证的示例)。不是所有的小sn-ps代码。您可以点击问题下方的edit 链接来编辑您的帖子。
  • 什么是InfoStrip?这是您要设置文本的JTextField 变量的名称,还是您创建的一个类(可能有一个名为setText() 的静态方法)?只是要清楚。顺便说一句,如前所述,请minimal reproducible example
  • 刚刚发布了 MVCE,抱歉没有早点发布。我确信解决方案非常简单,但我要么太盲目,要么太笨,无法弄清楚。
  • @Marcin 你的 MCVE 甚至没有运行。 GlobalVariables 是什么?你能给你整个代码的链接吗?我认为这也可以在不使用文档侦听器的情况下解决。顺便说一句,您可能需要遵循 java 类/变量命名约定。你的看起来更像 C# ;-)
  • GlobalVariables 是我自己的类,它工作得很好,你甚至可以跳过它与 JTextField 无关。 DocumentListener 工作正常,但似乎只是在一个简单的文本字段中更新文本需要相当多的努力。如果您对如何在不使用 DocumentListener 的情况下解决它有任何建议,请告诉我。它看起来也像 C#,因为这是我第一次用 Java 编写任何东西。

标签: java jtextfield


【解决方案1】:

这可能会有所帮助。来自JTextComponent 的javadocs,其中JTextField 继承setText() 方法:

设置文本

将此TextComponent 的文本设置为指定文本。如果文本为 null 或为空,则具有简单删除旧文本的效果。插入文本后,生成的插入符号位置由插入符号类的实现确定。

请注意,文本不是绑定属性,因此在更改时不会触发PropertyChangeEvent。要收听文本的更改,请使用DocumentListener

如果您想知道BoundProperty 是什么:

绑定属性在其值更改时通知侦听器。这有 两个含义:

  1. bean 类包括 addPropertyChangeListener() 和 用于管理 bean 的 removePropertyChangeListener() 方法 听众。
  2. 当绑定属性改变时,bean 发送一个 PropertyChangeEvent 到其注册的侦听器。属性更改事件 和 PropertyChangeListener 位于 java.beans 包中。

java.beans 包还包括一个类,PropertyChangeSupport, 它负责绑定属性的大部分工作。这个方便 类跟踪属性侦听器并提供便利 向所有注册的侦听器触发属性更改事件的方法。

P.S.:由于 OP 没有给出任何mcve,这听起来很相关。但是,我强烈认为,一旦我们看到 OP 的代码,情况就会有所不同。

【讨论】:

  • 谢谢,文档监听器解决了这个问题,我现在觉得很蠢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2010-11-26
  • 1970-01-01
  • 2021-02-16
  • 2015-09-29
  • 2021-07-24
  • 2018-12-21
相关资源
最近更新 更多