Я пытаюсь изучить программирование GUI на Java, и в настоящее время у меня есть фрейм, содержащий кнопку и метку. При нажатии кнопки появляется диалоговое окно, в котором указывается, сколько раз была нажата кнопка. Я хочу сделать то же самое для метки, но я не могу заставить ее обновляться, говоря, что она была нажата ноль раз.
Вот код кнопки:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CountButton extends JButton {
private int counter = 0;
public CountButton(String text) {
super(text);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
counter++;
JOptionPane.showMessageDialog(null, "You have clicked the button "
+ counter + " times!");
}
});
}
public int getCounter() {
return counter;
}
}
Вот моя попытка реализации:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LayoutPractice {
public static void main(String[] args) {
JFrame frame = new JFrame("GUI Layout Practice");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1020,700);
JPanel panelOne = new JPanel();
//Button portion of frame
JButton button = new CountButton("Click me for a dialog!");
panelOne.add(button);
JLabel label = new JLabel("The button has been pressed 0 times.");
panelOne.add(label);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("The button has been pressed " +
((CountButton) button).getCounter() + " times.");
}
});
frame.add(panelOne, BorderLayout.NORTH);
frame.setVisible(true);
}
}
Редактировать: я изменил код, чтобы добавить событие прослушивателя к кнопке, чтобы при ее нажатии он изменял текст метки с помощью label.setText(), но теперь моя проблема в том, что первое нажатие кнопки не обновить его. Он начинает обновляться только после двойного щелчка по нему, и тогда количество кликов на один меньше фактического количества кликов.
@AndrewThompson Итак, как я могу обновить его после инициализации?
Я дам вам знать, когда увижу SSCCE/MCVE.
@AndrewThompson Хорошо, я думаю, что это редактирование должно удовлетворять требованиям SSCCE.
@AndrewThompson Хорошо, давай попробуем еще раз...
См.: stackoverflow.com/help/someone-answers
У вас есть два ActionListeners:
Swing вызывает ActonListeners в обратном порядке, в котором прослушиватель добавляется к компоненту.
Таким образом, вы обновляете текст на этикетке до того, как переменная счетчика будет увеличена.
Лучше создать класс JPanel. Вы создаете экземпляр панели и добавляете его в фрейм. Этот класс будет содержать:
Вы создаете компоненты и добавляете их на панель, а также добавляете один слушатель к кнопке.
В этом дизайне все переменные определены в одном классе. Таким образом, все компоненты могут работать вместе друг с другом. Не определяйте компоненты Swing в методе main().
Например, см. раздел учебного пособия по Swing на Как использовать кнопки для лучшего дизайна вашего кода, показывающего, как создать панель с несколькими связанными компонентами.
Отлично, это было именно то, что мне нужно, и это сделало программу намного менее уродливой. Спасибо!