Изображение не будет отображаться, но доступно для нажатия

Я пытаюсь нарисовать изображение поверх 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();
  } 
}
Другие вопросы по тегам