Заставить JPanel перерисовываться при изменении размера подкомпонентаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Заставить JPanel перерисовываться при изменении размера подкомпонента

Сообщение Anonymous »

Я разрабатываю игру 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Заставить JPanel перерисовываться при изменении размера подкомпонента
    Anonymous » » в форуме JAVA
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Заставить JPanel перерисовываться при изменении размера подкомпонента
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • C# Как заставить скрытое окно продолжать перерисовываться и быть готовым к быстрому отображению?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как заставить QWidget перерисовываться?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как заставить QWidget перерисовываться?
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»