У меня есть JLabel, который не хочет обновлять - PullRequest
2 голосов
/ 02 апреля 2012

Я смотрел на другие потоки JLabel и, хотя они похожи, некоторые из них просто не подходят для того, что я испытываю.Во-первых, я хочу сказать, что я новичок в том, что касается Java.Далее я пытаюсь следовать учебным пособиям и демонстрациям на сайте docs.oracle.com.Теперь я могу обновить метку, когда набираю что-то в JTextField, и на этом есть ActionListener ...

Но у меня также есть Меню, и когда я выбираю пункт меню, это действие не требуется.обновить метку.

Вопросы -

  1. Как у меня есть слушатели действий как на JTextFields, так и на JMenuItems?Существуют ли два метода ActionEvent или я использую один метод и каким-то образом определяю каждый тип действия?
  2. Если я использую один и тот же базовый код в JTextField ActionEvent и JMenuItem ActionEvent, JLabel корректно обновляется с событием JTextField, но неСобытие JMenuItem.Они оба используют свойство messageField.setText.Может ли действие JMenuItem что-то делать для блокировки setText?

Я могу легко скопировать код здесь, но на данный момент он довольно похож на спагетти, поэтому, если вы хотите что-то увидеть, дайте мне знатьконкретно, и я опубликую это.

Буду признателен за любую помощь, которую кто-либо сможет оказать.

--- edit --- Вау !!Спасибо за все комментарии и предложения.

1 - я знаю, что это должен быть мой код.Как я уже упоминал, я просто собираю вещи из демонстраций и обучающих программ и пытаюсь изучить Java на своем пути.Я просто никогда не сталкивался с объектно-ориентированным .... 2 - я знаю, что отдельные слушатели работают.Я использую System.out.println для проверки, а также проверяю эти метки в режиме отладки, чтобы убедиться, что они действительно изменились.
3 - я посмотрю на различные ссылки и код, размещенный здесь, и посмотрю, смогу ли я понятьчто не так с моим кодом.

Действительно, еще раз спасибо!

--- edit ---

Вот то, что я изначально имел в своем методе 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 ]

6 голосов
/ 02 апреля 2012

Похоже, что вы сами делаете что-то не так в своем коде.Без правильного SSCCE трудно сказать, что вы делаете неправильно, поскольку он работает отлично, используя один и тот же ActionListener для обоих JMenuItem и JTextField.

. Вот пример программы длясовпадают с вашими:

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 JMenuItem и Updated with JTextField

Проверьте основной метод, можетбудь вы не смогли поместить свой код в EDT - поток диспетчера событий, что также может привести к таким проблемам.Все обновления в Swing GUI должны выполняться в потоке диспетчера событий.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ

Мне кажется, что CreateGalleryXML расширяет JPanel наПосмотри на это.См. Line 3 этого кода ниже, взятого из вашего обновления, здесь вы инициализируете новый Object из CreateGalleryXML внутри, когда у вас уже был один Объект window, созданный в Line 1:

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

Так что попробуйте заменить вышеуказанную вещь на эту

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

и посмотреть, что произойдет, и, пожалуйста, вернитесь обратно: -)

6 голосов
/ 02 апреля 2012

Используйте Action для инкапсуляции общих функций, которые должны совместно использоваться меню и связанными компонентами. Смотрите этот пример , который extends AbstractAction.

4 голосов
/ 02 апреля 2012

Практически все, что вам нужно знать, содержится в учебниках по Java . Внизу у них есть демо о том, как сделать как меню, так и текстовые поля. Они также включают в себя исходный код.

Я не могу сказать больше, что они говорят не лучше, но в ответ на ваши вопросы:

  1. Оба, вы можете иметь отдельного слушателя на каждый компонент, или тот, который выясняет, какой компонент ответственен за возникновение события действия. Я бы посоветовал вам использовать отдельные для каждой вещи.

  2. Не можете сказать, не видя код, вы уверены, что действие на JMenu даже запускается? Печатает ли что-нибудь на консоли и т. Д., Если вы используете System.out.println где-нибудь?

...