Java - текст JButton исчезает, если впоследствии определено действие actionPerformed - PullRequest
5 голосов
/ 19 декабря 2011

Это меня давно беспокоило. Если я определяю setText на JButton до , определяя setAction, текст исчезает:

JButton test = new JButton();
test.setText("test");  // Before - disappears!
test.setAction(new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});
this.add(test);

Если это после , проблем нет.

JButton test = new JButton();
test.setAction(new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});
test.setText("test");  // After - no problem!
this.add(test);

Кроме того, если я установлю текст в конструкторе JButton, это нормально! Yarghh!

Почему это происходит?

Ответы [ 5 ]

7 голосов
/ 19 декабря 2011

Как описано в документации :

Установка действия приводит к немедленному изменению всех свойств описано в разделе «Действие поддержки компонентов Swing».

Эти свойства описаны здесь и включают текст.

1 голос
/ 19 декабря 2011

Это потому, что Action имеет имя для элемента управления.Поскольку вы не задаете никакого имени в действии, оно получает пустую строку.

1 голос
/ 19 декабря 2011

Взгляните на

  private void setTextFromAction(Action a, boolean propertyChange)

в AbstractButton.Вы можете видеть, что он вызывает setText () в зависимости от действия.

Похоже, вы можете вызвать setHideActionText(true);, чтобы решить вашу проблему.

0 голосов
/ 15 ноября 2015

Если вы хотите обработать событие, вам не нужно Action. Вы можете добавить ActionListener:

JButton test = new JButton();
test.setText("test");  
test.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});
this.add(test);

Вызов setAction переопределяет предустановленный текст.

0 голосов
/ 19 декабря 2011

1) Слушатели помещают все события в EDT,

2) все события ожидают в EDT , и вывод на экран будет выполнен в один момент

3) вы должны разделить это на два отдельных Action внутри Listener

...