我看过其他JLabel线程,虽然类似,但有些似乎并不适用于我正在经历的事情。首先,我想说我是Java的新手。接下来,我正在尝试在docs.oracle.com网站上关注教程和演示。现在,当我在JTextField中键入内容时,我可以更新标签,并且有一个ActionListener ...
但我也有一个菜单,当我选择菜单项时,该操作不想更新标签。
问题 -
我可以轻松地在这里复制代码,但此刻它的意思很像意大利面,所以如果你想看到任何东西,请让我具体告诉我,我会发布它。
我很感激任何人都能提供的帮助。
--- ---编辑 哇!!感谢所有意见和建议。
1 - 我知道它必须是我的代码。正如我所提到的,我真的只是从演示和教程中拼凑起来,并尝试沿途学习Java。我从来没有得到面向对象的悬念....
2 - 我知道个别听众正在工作。我正在使用System.out.println进行验证,以及在调试模式下检查这些标签以确定它们确实发生了变化。
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);
}
答案 0 :(得分:6)
在你的代码中,好像你自己做错了什么。没有合适的SSCCE,很难说你做错了什么,因为它完美地工作,对JMenuItem
和JTextField
使用相同的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();
}
});
}
}
以下是两种情况下的输出:
和
检查主要方法,可能是您未能将您的代码放入EDT - 事件调度程序线程,这也可能导致此类问题。 Swing GUI上的所有更新都必须在Event Dispatcher Thread上完成。
最新编辑
在我看来,CreateGalleryXML
通过它的外观扩展JPanel
。请参阅以下此代码中的Line 3
代码,当您在{{{}创建了一个对象Object
时,您正在初始化CreateGalleryXML
内部的window
Line 1
1}}:
CreateGalleryXML window = new CreateGalleryXML();
frame.setJMenuBar(window.createMenuBar());
frame.add(new CreateGalleryXML());
因此,尝试将上述内容更改为此
CreateGalleryXML window = new CreateGalleryXML();
frame.setJMenuBar(window.createMenuBar());
frame.add(window);
看看会发生什么,请再次回复: - )
答案 1 :(得分:6)
答案 2 :(得分:4)
您可能需要了解的所有内容都在Java tutorials中。在底部,他们有关于如何同时执行菜单和文本字段的演示。它们还包括要查看的源代码。
我可以说他们没有更好的说法,但回答你的问题:
两者都可以在每个组件上设置单独的侦听器,或者确定哪个组件负责导致操作事件。我建议你为每件事使用不同的。
在看到代码时真的无法说出来,您确定JMenu
上的操作是否正在触发?如果你在某个地方使用System.out.println
,它会在控制台上打印一些东西吗?