Как обновить компоненты, прослушивая кнопку в java - PullRequest
1 голос
/ 07 мая 2020

Мне немного жаль задавать этот вопрос, поскольку он кажется очевидным, но я не могу найти свое решение в одиночку.

Я кодирую небольшое приложение в Java, и Я столкнулся с некоторыми проблемами при «перерисовке» компонентов свинга. По сути, я хочу, чтобы мой JFrame обновлялся при возникновении события. Мне удалось воспроизвести проблему в приведенном ниже коде. Этот код должен отображать две кнопки (что он делает) и заменять их третьей кнопкой, когда вы нажимаете на первую кнопку (а это не так).

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example extends JFrame implements ActionListener {

    private JButton button = new JButton("Button 1");
    private JButton button2 = new JButton("Button 2");
    private JButton button3 = new JButton("Button 3");
    private JPanel buttons = new JPanel();

    public void init() {
        this.setVisible(true);
        this.setSize(500,500);
        buttons.add(button);
        buttons.add(button2);
        this.add(buttons);
        this.button.addActionListener(this);
    }

    public void update() {
        this.removeAll();
        buttons.add(button3);
        this.revalidate();
    }

    public static void main(String[] args) {
        Example ex = new Example();
        ex.init();
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button) {
            update();
        }
    }
}

Я почти уверен, что Я что-то не так делаю в методе update(). На самом деле мне очень сложно понять, как работает removeAll(), revalidate(), repaint() и c, и я думаю, что это проблема. Я попытался вызвать те же методы на панели buttons, это почти сработало, но у меня все еще есть ошибка графического c, и я хотел бы сделать это для всего контейнера. Я тоже пробовал вызвать эти методы на this.getContentPane(), но это не работает.

Может кто-нибудь попробовать мне с этим помочь?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Вы удаляете все компоненты из this (в данном случае это JFrame (поскольку вы расширяете его, что не требуется, и вместо этого вы должны создать экземпляр из него, а не наследовать от это, поскольку вы не изменяете поведение JFrame, поэтому лучше просто создать его экземпляр). См .: Расширяет JFrame вместо создания его внутри программы

В этом случае вы добавляете свои компоненты следующим образом:

JFrame > buttons (JPanel) > JButtons

И вы пытаетесь удалить

JFrame > everything

Это включает в себя contentPane, вместо этого вам следует позвонить.

buttons.removeAll()

Внутри метода update().

А также вызовите this.repaint(), чтобы ваш метод update() стал:

public void update() {
    buttons.removeAll();
    buttons.add(button3);
    this.revalidate();
    this.repaint();
}

Или лучший подход - используйте CardLayout, как рекомендовано @AndrewThompson в комментарии ниже. Таким образом, вам не нужно обрабатывать удаление / перекраску для каждого компонента, поскольку CardLayout сделает это за вас. Для пример

0 голосов
/ 07 мая 2020

это работает,

public void update() {
    buttons.remove(button);
    buttons.remove(button2);
    buttons.add(button3);
    this.revalidate();
    this.repaint();
}
...