2017-04-05 12 views
0

기본적으로 JPanel 그리드 행렬에 원을 추가하려고합니다 (이것이 내 주요 문제가되는 곳입니다). 아래 코드를 실행하면 새로운 OvalComponent 클래스가 호출되어 그리드의 (1,1) 위치에 원을 추가하면 클래스가 읽히지 만 페인트 구성 요소 기능은 건너 뜁니다. 구성 요소가 추가 된 상태가 0x0의 크기와 추가 된 및 스윙은 그것을 칠 필요가 없다는 것을 알 수있을만큼 영리하므로Java - paintComponent는 런타임 중에 읽히지 만 구현되지 않습니다.

package Exercises; 

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

/** 
* Created by user on 4/1/2017. 
*/ 
public class Mazes extends JPanel { 

public static void main(String[] args) throws FileNotFoundException { 
    Mazes maze = new Mazes(); 
} 

public Mazes() throws FileNotFoundException{ 
    Boolean[][] maze = Exercise4.readMaze(); 
    int row = maze.length; 

    JFrame f = new JFrame("Maze"); 
    f.setLayout(new GridLayout(row, row)); 

    JPanel[][] grid = new JPanel[row][row]; 
    for (int i = 0; i < row; i++)  { 
     for (int j = 0; j < row; j++)    { 
      grid[i][j] = new JPanel(); 
      grid[i][j].setOpaque(true); 
      if ((i==1&&j==1) || (i==row-1 && j==row-1)) 
       grid[i][j].add(new OvalComponent()); 

      if (maze[i][j].equals(false)){ 
       grid[i][j].setBackground(Color.BLACK);} 
      else grid[i][j].setBackground(Color.WHITE); 
      f.add(grid[i][j]); 
     } 
    } 

    //f.add(new JButton("Reset"), BorderLayout.SOUTH); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.pack(); 
    f.setVisible(true); 
} 
class OvalComponent extends JComponent { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     g.fillOval(4, 4, 10, 10); 
} 
} 

답변

2

OvalComponent, 아니 정의 크기 (0x0 기본값을)이 없습니다.

구성 요소의 getPreferredSize 방법을 무시하고 예를 들어 적절한 크기

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

를 반환