#java #user-interface #refresh
#java #пользовательский интерфейс #обновить
Вопрос:
У меня есть фрейм с несколькими панелями. Всякий раз, когда я нажимаю / отпускаю / щелкаю центральную панель, JLabel показывает количество раз и координаты, в которых я выполнил такое действие. Проблема в том, что окно не обновляется, поэтому все эти значения в JLabel остаются равными 0. Обычно я бы использовал repaint()
Paintcontents , но я не использую этот метод.
Вот фрагмент кода, в котором я должен «перерисовать»:
public void mousePressed(MouseEvent e) {
pressCounter ;
x = e.getX();
y = e.getY();
buildIt(); //this works, but doesn't do what i want it to do
}
Вызов buildIt()
на самом деле работает, но он открывает новое окно после каждого действия вместо обновления исходного окна. Я также пробовал revalidate()
и removeAll()
здесь, но они, похоже, вообще ничего не делают.
Итак, как мне обновить окно?
Вот полный код для справки:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MouseMonitor extends JPanel implements MouseListener {
JFrame frame;
JPanel topPanel, centerPanel, bottomPanel;
JLabel pressLabel, releaseLabel, clickLabel, xLabel, yLabel;
int pressCounter = 0;
int releaseCounter = 0;
int clickCounter = 0;
int x, y;
void buildIt() {
frame = new JFrame("Mouse Monitor");
topPanel = new JPanel();
centerPanel = new JPanel();
bottomPanel = new JPanel();
pressLabel = new JLabel("pressed: " pressCounter);
releaseLabel = new JLabel("released: " releaseCounter);
clickLabel = new JLabel("clicked: " clickCounter);
xLabel = new JLabel("x-coordinate: " x);
yLabel = new JLabel("y-coordinate: " y);
frame.add(topPanel, BorderLayout.NORTH);
frame.add(centerPanel, BorderLayout.CENTER);
frame.add(bottomPanel, BorderLayout.SOUTH);
topPanel.add(pressLabel);
topPanel.add(releaseLabel);
topPanel.add(clickLabel);
bottomPanel.add(xLabel);
bottomPanel.add(yLabel);
pressLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
releaseLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
clickLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
xLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
yLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
Color color = new Color(193, 236, 255);
centerPanel.setBackground(color);
centerPanel.addMouseListener(this);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void mousePressed(MouseEvent e) {
pressCounter ;
x = e.getX();
y = e.getY();
buildIt();
}
public void mouseReleased(MouseEvent e) {
releaseCounter ;
}
public void mouseClicked(MouseEvent e) {
clickCounter ;
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public static void main(String[] args) {
new MouseMonitor().buildIt();
}
}
Комментарии:
1. Вместо создания совершенно нового фрейма просто измените содержимое
xLabel
иyLabel
.2. Разве я не сделал это, написав
x = e.getX();
andy = e.getY();
?3. Нет. Это устанавливает значение
x
иy
. Нет никакого кода, кроме как при создании ваших окон, который соединяетx
y
метки и и. Вам нужно явно присваивать меткам новое значение каждый раз, когда вы хотите, чтобы они менялись, используяxLabel.setText(...)
,yLabel.setText(...)
.
Ответ №1:
Вам не нужно вызывать built()
метод для обновления фрейма или панели. Для того, что вы хотите, вам просто нужно изменить текст на ярлыке. Так, например, рассматривая mousePressed(MouseEvent e)
метод, удалите buildIt()
метод:
public void mousePressed(MouseEvent e) {
pressCounter ;
pressLabel.setText("pressed: " pressCounter);
}
Сделайте это для каждого из методов, и все готово. Поддерживайте код в main
методе.