2012-04-02 42 views
2

我已经看过其他JLabel线程,虽然类似,但有些似乎不适用于我正在经历的。首先,我想说我是Java的新手。接下来,我正在尝试遵循docs.oracle.com网站上的教程和演示。现在,我可以更新标签,当我输入东西到一个JTextField,并有一个ActionListener ...我有一个JLabel,不想更新

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

问题 -

  1. 我怎么对的两个JtextField和JMenuItems动作监听器?是否有两个ActionEvent方法,或者我使用一种方法并以某种方式识别每种类型的操作?
  2. 如果我在JTextField的ActionEvent和JMenuItem的ActionEvent中使用相同的基本代码,JLabel可以正确更新JTextField事件而不是JMenuItem事件。它们都使用messageField.setText属性。 JMenuItem操作可以做些什么来阻止setText?

我可以很容易地在这里复制代码,但此时它很像意大利面条,所以如果您想查看任何内容,请告诉我具体情况,然后发布。

我希望任何人都能提供帮助。

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

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

回答

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 - Event Dispatcher Thread中,这也可能导致这些问题。 Swing GUI上的所有更新都必须在Event Dispatcher Thread上完成。

最新编辑

在我看来,那CreateGalleryXML通过它的外观延伸JPanel。看到从您的更新采取这一下面的代码Line 3,这里要初始化新CreateGalleryXMLObject里面,当你已经有了一个对象windowLine 1创建:

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

所以尽量上面啄改变这个

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

,并看看会发生什么,并请你再次恢复:-)

+0

哇......这是为我做的。我几乎把所有东西都报废了,从你的代码开始,然后从那里开始建立起来。我仍然有点困惑,但我现在已经走得很远,看起来他们正在朝着正确的方向前进。有足够的核心,我可以看到我的消息标签在必要时被更新。回过头来看看我以前的代码,我认为这与我的createAndShowGUI方法无意中创建了多个框架有关?也许? – Osh 2012-04-04 03:49:53

+0

我发布了我的原创createAndShowGUI,因为我认为这是我所有问题的根源。如果您有兴趣,那就是对我原文的编辑。 再次感谢您的所有帮助!我真的很感激它! – Osh 2012-04-04 04:03:24

+0

@Osh:我已经编辑了我的帖子,看起来像你创建一个新的对象,如上所述是所有问题的真正原因。尝试纠正如上所述,请回复:-) – 2012-04-04 06:15:42

4

,你可以需要知道的差不多一切都在Java tutorials。在底部他们有演示如何做菜单和文本字段。它们还包括源代码以供查看。

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

  1. 两个,可以有不同的听众的是计算出每个部件,或者一个什么组件负责导致行动事件。我建议你为每件事物使用不同的东西。

  2. 看不出代码真的说不出来,你确定JMenu上的动作是否解雇?如果你在某个地方使用System.out.println,它会在控制台上打印什么?

+0

+1,指出要尝试使用'System.out.println(...)',至少不管你在Swing代码中做什么错误都会打印。 – 2012-04-02 06:25:36

6

使用Action封装常见的功能,必须由菜单和相关组件共享。看到这个exampleextends AbstractAction

+0

+1,我想你什么时候可以使用'AbstractAction',我必须用它来代替'ActionLIstener' :-)我忘了这个词,代表这种情况:-) – 2012-04-02 09:17:45

+1

@GagandeepBali:这是防止重复代码分开演变的好方法。 – trashgod 2012-04-02 09:21:57