2012-05-20 2 views
1

Может быть, это плохая идея, но я написал подкласс для JMenuItem, чтобы добавить новый конструктор. Давайте назовем это JMenuItemX:Использует метод AbstractionAction putValue() с подклассами JMenuItem и т. Д.?

import java.awt.event.ActionListener; 
import javax.swing.JMenuItem; 

@SuppressWarnings("serial") 
public class JMenuItemX extends JMenuItem 
{ 
    public JMenuItemX(final String the_text, final char the_mnemonic, 
        final ActionListener the_action) 
    { 
    super(the_text); 
    setMnemonic(the_mnemonic); 
    addActionListener(the_action); 
    } 
} 

Теперь я пытаюсь добавить всплывающую подсказку к компоненте с помощью AbstractAction:

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JOptionPane; 

@SuppressWarnings("serial") 
public class AboutAction extends AbstractAction 
{ 

    public AboutAction() 
    { 
    super("About"); 
    putValue(SHORT_DESCRIPTION, "Show the popup window"); 
    } 

    @Override 
    public void actionPerformed(final ActionEvent the_event) 
    { 
    JOptionPane.showMessageDialog(null, "Hello World!"); 
    } 
} 

и построение компонент, как так (в JFrame, JMenuBar, и JMenu уже установлены):

menu.add(new JMenuItemX("About", 'a', new AboutAction())); 

(Как вы можете видеть, если я добавляю несколько пунктов меню, этот формат однострочного легче читать.)


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

JMenuItem about = new JMenuItem(new AboutAction()); 
about.setMnemonic('a'); 
menu.add(about); 

Как я могу получить AbstractAction работать с моим JMenuItem подклассе?

ответ

3

Ваш переопределенный конструктор не использует конструктор JMenuItem, принимающий аргумент Action в качестве аргумента, и не вызывает также setAction(). Таким образом, ваш пункт меню не связан с действием.

Я бы не создал подкласс просто для добавления конструктора. Почему бы просто не создать заводской метод?

public JMenuItem createMenuItemWithListener(String text, 
              char mnemonic, 
              ActionListener action) { 
    JMenuItem result = new JMenuItem(text); 
    result.setMnemonic(mnemonic); 
    result.addActionListener(action); 
    return result; 
} 

public JMenuItem createMenuItemWithAction(char mnemonic, 
              Action action) { 
    JMenuItem result = new JMenuItem(action); 
    result.setMnemonic(mnemonic); 
    return result; 
} 
+0

спасибо. Я должен был понять, что 'JMenuItem (действие)' не совпадает с 'JMenuItem.addActionListener()'. – iglvzx

Смежные вопросы