2013-11-06 4 views
2

У меня есть JPanel, метод paintComponent (Graphics g) не вызывается. Я знаю, что это обычная проблема, но ни один из предложений, которые я нашел до сих пор, не смог исправить. Вот код для JPanel:Java JPanel paintComponent (Графика g) не называется

import javax.swing.*; 
import java.awt.*; 

public class Grid extends JPanel 

{ 
    Candy[][] gridRep = new Candy[8][8]; 
    public Grid() 

    { 
     this.setLayout(new GridLayout(8,8)); 
     this.populateRandom(); 
     this.repaint(); 
    } 

    ... 

    public void paintComponent(Graphics g){ 
     Graphics2D g2 = (Graphics2D)g; 
     for (int r = 0; r<8; r++){ 
      for (int c = 0; c<8; c++){ 
       g2.setColor(gridRep[r][c].getColor()); 
       g2.drawOval(getXCoordinate(gridRep[r][c])*15, getYCoordinate(gridRep[r][c])*15, 10, 10); 
       System.out.println("repainting"); 
      } 
     } 
    } 

} 

Как вы можете видеть, я называю перекрасить() в конструкторе, но ничего не делает. Я также называю это волей-неволей в классе JFrame, который создает объект этого класса:

import javax.swing.*; 
import java.awt.*; 

public class Game 
{ 
    private Grid grid; 
    private JFrame frame; 
public Game(){ 
this.makeFrame(); 
} 

private void makeFrame(){ 
    grid = new Grid(); 
    frame = new JFrame ("Frame"); 
    Container contentPane = frame.getContentPane(); 
    contentPane.setLayout(new FlowLayout()); 
    //grid.paint(grid.getGraphics()); 
    grid.repaint(); 
    frame.add(grid); 
    grid.repaint(); 
    frame.pack(); 
    grid.repaint(); 
    frame.setVisible(true); 
    grid.repaint(); 
} 
+1

Картина в свинг представляет собой сложную цепь класса метода, вы должны вызвать 'super.paintXxx' иначе вы будете испытывать случайный и трудно повторить вопросы живописи. Взгляните на [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) для получения более подробной информации – MadProgrammer

ответ

3

Как вы можете видеть, я называю перекрасить() в конструкторе, но это ничего не делает

Вам не нужно ссылаться на repaint(). Swing определит, когда нужно перекрасить.

В любом случае в этом случае он ничего не делает, поскольку компонент еще не добавлен в GUI.

contentPane.setLayout(new FlowLayout()); 

Вы используете FlowLayout, который соответствует размеру компонентов. Ваш пользовательский компонент, в котором вы делаете рисунок, не имеет предпочтительного размера, поэтому его размер равен (0, 0), поэтому рисовать нечего.

Отменить метод getPreferredSize(), чтобы вернуть размер компонента. Похоже, каждая сетка (15, 15), так что вы должны использовать:

@Override Dimension getPreferredSize() 
{ 
    return new Dimension(120, 120); 
} 

Конечно, было бы лучше, чтобы определить переменную для вас класса содержит размер сетки и количество сеток, а не жесткий codeing 8 и 15 через ваш код.

0

Вы пропустили эту линию:

super.paintComponent(g); 
+0

Это отличный совет и вызовет проблемы, но не является корнем причина проблемы ... – MadProgrammer

3

У вас проблема с компоновкой. Вы используете FlowLayout и добавляете компонент с предпочтительным размером 0,0. Либо использовать BorderLayout или дать сетке получить предпочтительный способ размер:

public Dimension getPreferredSize() { 
    return new Dimension(somethingWidth, somethingHeight); 
} 
Смежные вопросы