我有一个不想更新的JLabel

时间:2012-04-02 03:54:10

标签: java swing jlabel

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

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

问题 -

  1. 如何在JTextFields和JMenuItems上都有动作侦听器?是否有两个ActionEvent方法,或者我是否使用一种方法并以某种方式识别每种类型的操作?
  2. 如果我在JTextField ActionEvent和JMenuItem ActionEvent中使用相同的基本代码,则JLabel会正确更新JTextField事件但不会更新JMenuItem事件。它们都使用messageField.setText属性。 JMenuItem动作是否可以阻止setText?
  3. 我可以轻松地在这里复制代码,但此刻它的意思很像意大利面,所以如果你想看到任何东西,请让我具体告诉我,我会发布它。

    我很感激任何人都能提供的帮助。

    --- ---编辑 哇!!感谢所有意见和建议。

    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);  
    }  
    

3 个答案:

答案 0 :(得分:6)

在你的代码中,好像你自己做错了什么。没有合适的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上的所有更新都必须在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)

使用Action封装必须由菜单和相关组件共享的常用功能。请见extends AbstractAction。{/ p> example

答案 2 :(得分:4)

您可能需要了解的所有内容都在Java tutorials中。在底部,他们有关于如何同时执行菜单和文本字段的演示。它们还包括要查看的源代码。

我可以说他们没有更好的说法,但回答你的问题:

  1. 两者都可以在每个组件上设置单独的侦听器,或者确定哪个组件负责导致操作事件。我建议你为每件事使用不同的。

  2. 在看到代码时真的无法说出来,您确定JMenu上的操作是否正在触发?如果你在某个地方使用System.out.println,它会在控制台上打印一些东西吗?