Изображение не будет отображаться, но доступно для нажатия
Я пытаюсь нарисовать изображение поверх JDialog, которое содержит фон. Я называю класс, который нарисует это изображение. Здесь "paintComponent" никогда не вызывается:
// class Card
public Card(BufferedImage faceUp, int value) {
this.faceUp = faceUp;
this.hide = false;
this.value = value;
setOpaque(false);
setLayout(new FlowLayout());
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(Card.this.getX());
System.out.println("click");
}
});
repaint();
}
@Override
public void paintComponent(Graphics g) {
System.out.println("here");
g.drawImage((this.hide) ? Cards.back : this.faceUp, Cards.CARD_WIDTH, Cards.CARD_HEIGHT, this);
}
И я называю это в моем главном конструкторе:
public Constructor() {
initComponent();
Card c1 = new Card(Cards.cardsContainer.get(1), 1%14); //Image, value
jPanel1.add(c1);
c1.setVisible(true);
c1.setPreferredSize(new Dimension(200, 100));
c1.revalidate();
c1.repaint();
repaint();
}
@Override
public void paint(Graphics g) {
try {
Graphics2D g2 = (Graphics2D) g;
BufferedImage background_image;
background_image = ImageIO.read(new File(this.background));
Graphics2D big = background_image.createGraphics();
Rectangle rectangle = new Rectangle(0, 0, 20, 20);
g2.setPaint(new TexturePaint(background_image, rectangle));
Rectangle rect = new Rectangle(0, 0, this.getWidth(), this.getHeight());
g2.fill(rect);
} catch (IOException ex) {
Logger.getLogger(Bataille.class.getName()).log(Level.SEVERE, null, ex);
}
}
Есть идеи почему?
2 ответа
Оооо мой... Карта была показана, но с borderLayout
был запас. Поэтому я увеличиваю панель, и она появляется.
Ваша карта показывает размер 0, как я и подозревал. Одна вещь, которую вы можете сделать, это дать ей предпочтительный размер:
public Dimension getPreferredSize() {
if (Cards.back != null) {
return new Dimension(Cards.back.getWidth(), Cards.back.getHeight());
} else {
return super.getPreferredSize();
}
}