Я узнал, что если вы переопределите
protected void paintComponent(Graphics g)
, вы можете получить изображение, нарисованное как фон класса, расширяющего javax.swing.JPanel. В моем коде у меня есть 2 экземпляра одного и того же класса, расширяющего JPanel с почти точно таким же кодом, только с другой позицией и фоновым изображением во втором JPanel, и хотя один получает фон, другой нет. Вот мой код:
public class CardPanel extends JPanel {
private int x, y, width, height;
private BufferedImage background;
public CardPanel(int x, int y, int width, int height, BufferedImage background) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.background = background;
createCardPanel();
}
private void createCardPanel() {
setPreferredSize(new Dimension(width, height));
setMaximumSize(new Dimension(width, height));
setMinimumSize(new Dimension(width, height));
setFocusable(false);
setOpaque(true);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, x, y, null);
}
}
И как я его использую:
pCardPanel = new CardPanel();
dCardPanel = new CardPanel();
Объявление CardPanels
private void createCardPanels(String imgPath) {
BufferedImage background = ImageLoader.loadImage(imgPath);
pCardPanel = new CardPanel(0, (height - Card.CARD_HEIGHT), width, Card.CARD_HEIGHT, background.getSubimage(0, (height - Card.CARD_HEIGHT), width, Card.CARD_HEIGHT));
dCardPanel = new CardPanel(0, 0, width, Card.CARD_HEIGHT, background.getSubimage(0, 0, width, Card.CARD_HEIGHT));
this.add(pCardPanel, BorderLayout.SOUTH);
this.add(dCardPanel, BorderLayout.NORTH);
}
Метод создания и добавления CardPanels
createCardPanels("/textures/background.png");
Использование метода
public void addCardImage(BufferedImage img, boolean playerCard) {
JLabel imgLabel = new JLabel();
ImageIcon icon;
icon = new ImageIcon(img);
imgLabel.setIcon(icon);
cardImages.add(imgLabel);
if (playerCard)
pCardPanel.add(imgLabel);
else
dCardPanel.add(imgLabel);
display.pack();
}
Этот последний метод вызывается для добавления изображений карточек на панель, эта часть работает. Теперь к моей проблеме: вот как это выглядит. (есть и другие fl aws, такие как положение карты, но это будет более поздняя проблема, которую я могу исправить сам) Как видите, панель на внизу (pCardPanel) нет фонового изображения. Есть идеи, почему это может быть так? Заранее спасибо