Задача # 1
Каждый раз, когда вы звоните Card#getCardLabel
, он создает новый JLabel
экземпляр ...
class Card {
// Hardcoded for debugging, so every card image is a 2 of hearts
public JLabel getCardLabel() {
return new JLabel(new ImageIcon(getClass()
.getResource("/cards/2h.png")));
}
}
Это означает, что когда вы делаете ...
app.getPanel().add(app.getPlayerCards().get(0).getCardLabel()).setBounds(0, 0, 72, 96);
и ...
System.out.println("DEBUG: " + app.getPlayerCards().get(0).getCardLabel());
и ...
app.getPlayerCards().get(0).getCardLabel().setIcon(null);
app.getPlayerCards().get(0).getCardLabel().revalidate();
app.getPlayerCards().get(0).getCardLabel().repaint();
app.getPanel().remove(app.getPlayerCards().get(0).getCardLabel());
каждый вызов фактически создает новый экземпляр JLabel
, поэтому один на экране не имеет ничего общего с тем, который вы пытаетесь изменить.
Так что вместо этого ваш Card#getCardLabel
должен создавать только ОДИН JLabel
ОДИН РАЗ, это также называется «отложенной загрузкой». ..
class Card {
private JLabel label;
//...
// Hardcoded for debugging, so every card image is a 2 of hearts
public JLabel getCardLabel() {
if (label == null) {
// Simple image for demonstration purposes
BufferedImage img = new BufferedImage(100, 150, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 100, 150);
g2d.setColor(Color.RED);
g2d.drawLine(0, 0, 100, 150);
g2d.drawLine(100, 0, 0, 150);
g2d.dispose();
label = new JLabel(new ImageIcon(img));
}
return label;
}
}
Задача № 2
Swing является ленивым (хорошо, он «оптимизирован»), что означает, что добавление или удаление компонентов само по себе не вызывает макет или краска проходит. Это сделано для того, чтобы вы могли вносить значительные изменения в пользовательский интерфейс и не пытаться обновлять каждое изменение, что будет очень медленным.
Это означает, что когда вы добавляете или удаляете компонент, вы должны также вызвать repaint
, чтобы вызвать новый проход рисования (я бы также порекомендовал revalidate
, но вы не используете никаких менеджеров компоновки, поэтому он ничего не сделает для вас)
app.getPanel().remove(app.getPlayerCards().get(0).getCardLabel());
app.getPanel().repaint();