gpt4 book ai didi

java - 我有一个不想更新的 JLabel

转载 作者:行者123 更新时间:2023-12-04 05:45:22 25 4
gpt4 key购买 nike

我查看了其他 JLabel 线程,虽然相似,但有一些似乎不适用于我正在经历的事情。首先,我想说我是 Java 的新手。接下来,我尝试按照 docs.oracle.com 站点上的教程和演示进行操作。现在,当我在 JTextField 中键入内容并且上面有一个 ActionListener 时,我可以更新标签...

但我还有一个菜单,当我选择一个菜单项时,该操作不想更新标签。

问题 -

  1. 如何在 JTextFields 和 JMenuItems 上设置 Action 监听器?是否有两种 ActionEvent 方法,还是我使用一种方法并以某种方式识别每种类型的操作?
  2. 如果我在 JTextField ActionEvent 和 JMenuItem ActionEvent 中使用相同的基本代码,则 JLabel 会使用 JTextField 事件而不是 JMenuItem 事件正确更新。它们都使用 messageField.setText 属性。 JMenuItem 操作是否可以阻止 setText?

我可以轻松地在此处复制代码,但目前它很像意大利面条,所以如果您想查看任何内容,请具体告诉我,我会发布。

如果有人能提供任何帮助,我将不胜感激。

---编辑---哇!!感谢您提出的所有意见和建议。

1 - 我知道它必须是我的代码。正如我所提到的,我实际上只是将演示和教程中的东西拼凑在一起,并尝试一路学习 Java。我只是从来没有掌握面向对象的窍门....2 - 我知道个别听众正在工作。我正在使用 System.out.println 进行验证,并在 Debug模式下检查这些标签以查看它们确实已更改。
3 - 我会查看此处发布的各种链接和代码,看看我是否能找出我的代码有什么问题。

真的,再次感谢!

---编辑---

这是我最初在 createAndShowGUI 方法中的内容....

private static void createAndShowGUI()   
{
JFrame frame = new JFrame("Create XML for Photo Gallery");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

CreateGalleryXML window = new CreateGalleryXML();
frame.setJMenuBar(window.createMenuBar());
frame.add(new CreateGalleryXML());

frame.pack();
frame.setVisible(true);
}

最佳答案

似乎您自己在代码中做错了什么。没有适当的 SSCCE很难说你做错了什么,因为它工作得很好,对 JMenuItemJTextField 使用相同的 ActionListener。

这是一个与您的相匹配的示例程序:

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

public class UpdateLabel
{
private JLabel label;
private String labelText;

private ActionListener action = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
setLabelText((String) ae.getActionCommand());
label.setText(getLabelText());
}
};

private void setLabelText(String text)
{
labelText = text;
}

private String getLabelText()
{
return labelText;
}

private void createAndDisplayGUI()
{
final JFrame frame = new JFrame("Update Label");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationByPlatform(true);

JMenuBar menuBar = new JMenuBar();
JMenu programMenu = new JMenu("Program");
JMenuItem exitMenuItem = new JMenuItem("Exit");
exitMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
frame.dispose();
}
});
JMenu labelMenu = new JMenu("Label");
JMenuItem updateMenuItem = new JMenuItem("Update Label");
updateMenuItem.setActionCommand("Updated by JMenuItem");
updateMenuItem.addActionListener(action);

programMenu.add(exitMenuItem);
labelMenu.add(updateMenuItem);
menuBar.add(programMenu);
menuBar.add(labelMenu);

frame.setJMenuBar(menuBar);

JPanel contentPane = new JPanel();

label = new JLabel("I am the LABEL which will be updated!!");
contentPane.add(label);

JTextField tfield = new JTextField(10);
tfield.setActionCommand("Updated by JTextField");
tfield.addActionListener(action);

frame.add(contentPane, BorderLayout.CENTER);
frame.add(tfield, BorderLayout.PAGE_END);

frame.pack();
frame.setVisible(true);
}

public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new UpdateLabel().createAndDisplayGUI();
}
});
}
}

这两种情况下的输出:

Updated with JMenuItemUpdated with JTextField

请检查主要方法,可能是您未能将代码放入 EDT - 事件调度线程,这也可能导致此类问题。 Swing GUI 上的所有更新都必须在事件调度程序线程上完成。

最新编辑

在我看来,CreateGalleryXML 从外观上看扩展了 JPanel。请参阅从您的更新中获取的以下代码的 第 3 行,在这里您正在初始化 CreateGalleryXML 的新 Object,而您已经有一个在 第 1 行 创建的对象 window:

CreateGalleryXML window = new CreateGalleryXML();  
frame.setJMenuBar(window.createMenuBar());
frame.add(new CreateGalleryXML());

所以试着把上面的东西改成这个

CreateGalleryXML window = new CreateGalleryXML();  
frame.setJMenuBar(window.createMenuBar());
frame.add(window);

看看会发生什么,请再次返回 :-)

关于java - 我有一个不想更新的 JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com