Я разрабатываю игру Java Swing, в которой JPanel отображает информацию, связанную с игрой, а на эту панель накладывается меню, в котором некоторые кнопки не всегда видны.
Проблема: когда кнопка скрыта, фоновая панель не перерисовывается должным образом.
Упрощенный код:
public class MyPanel extends JPanel { // This is where I draw game-related stuff in the background
public MyPanel() {
JPanel toolPanel = new JPanel();
this.add(toolPanel, BorderLayout.SOUTH);
}
}
public class ToolPanel extends JPanel { // This panel holds the buttons overlaid onto MyPanel
Color transparent = new Color(255, 255, 255, 0);
toolPanel.setForeground(transparent);
toolPanel.setBackground(transparent);
JButton mainButton = new JButton("main button");
toolPanel.add(mainButton);
JButton subButton = new JButton("sub-button");
toolPanel.add(subButton);
subButton.setVisible(false);
mainButton.addActionListener((e) -> {
subButton.setVisible(!subButton.isVisible());
System.out.println("Setting sub-button to " + subButton.isVisible());
// repaint();
// invalidate(); // None of these can force the parent JPanel to repaint...
});
}
Что я имею после инициализации:
нормальное состояние
Что я получаю, когда показываю вторую кнопку:
фон подпанель нарисована неправильно
И когда я сделал вторую кнопку невидимой (я ожидаю вернуться к первому изображению):
основная кнопка в порядке, панель кнопок фон - нокаут.
Редактировать: минимальный воспроизводимый пример:
public class SSCCE {
public static void main(String[] args) {
JFrame f = new JFrame();
JPanel drawingPanel = new JPanel() {
@Override
public void paintComponent(Graphics g) { // Default black and gray lines
int w = g.getClipBounds().width;
int h = g.getClipBounds().height;
for (int i = 0; i < 10; i++) {
g.setColor(Color.black);
g.fillRect(i * w / 10, 0, w / 20 + 1, h);
g.setColor(Color.gray);
g.fillRect((int) ((i + 0.5) * w / 10), 0, w / 20 + 1, h);
}
}
};
drawingPanel.add(new ButtonPanel());
drawingPanel.setPreferredSize(new Dimension(600, 400));
f.setContentPane(drawingPanel);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.pack();
}
private static class ButtonPanel extends JPanel {
// mainButton is always visible.
JButton mainButton;
// secondary button is visible only when the mouse hovers the ButtonPanel or the mainButton or the secondary button.
JButton secondaryButton;
public ButtonPanel() {
super();
mainButton = new JButton("main button alone");
secondaryButton = new JButton("secondary button");
add(mainButton);
add(secondaryButton);
secondaryButton.setVisible(false);
setBackground(Color.red);
MouseAdapter listener = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
secondaryButton.setVisible(true);
mainButton.setText("main button not alone");
invalidate();
revalidate();
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
secondaryButton.setVisible(false);
mainButton.setText("main button alone");
invalidate();
revalidate();
repaint();
}
};
this.addMouseListener(listener);
mainButton.addMouseListener(listener);
secondaryButton.addMouseListener(listener);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... nt-resizes
Заставить JPanel перерисовываться при изменении размера подкомпонента ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение