2013-02-09 5 views
1

저는 스윙을 사용하는 GUI 프로그래밍에 익숙하지 않고 멍청한 문제라고 확신합니다.JPanel의 요소가 나타나지 않습니다.

내부에 JPanel이있는 JFrame을 만들었습니다. 그런 다음 배열의 각 요소에 대해 JLabel을 추가하려고합니다. 문제는 요소가 패널에 나타나지 않는다는 것입니다. 배열 요소가 println 문을 사용하여 등록되었는지 확인 했으므로 문제는 아닙니다. 저는 어딘가에서 진술을 놓치고 있다고 생각합니다 ... 조언하십시오. 내가 말했듯이 완벽 할 때 콘솔에 출력하기 때문에, 나는 미로 클래스가 잘 작동 것을 알고,

package robots; 

import java.util.Random; 


public class Maze { 
    public Cell[][] maze; 
    final int width; 
    final int height; 

    public Maze(){ 
     width = 20; 
     height = 20; 
     maze = new Cell[width][height]; 
     for (int row = 0; row < height; row++){ 
      for (int col = 0; col < width; col++){ 
       maze[row][col] = new Cell(row, col); 
      } 
     } 

     // set borders 
     for (int curr = 0; curr < height; curr++) { 
      maze[0][curr].setState("border"); 
      maze[curr][0].setState("border"); 
      maze[height - 1][curr].setState("border"); 
      maze[curr][width - 1].setState("border"); 
     } 

     // initially mark all cells as walls 
     for (int row = 1; row < height - 1; row++) { 
      for (int col = 1; col < width - 1; col++) { 
       maze[row][col].setState("wall"); 
      } 
     } 

    } 

    private boolean isValidTurn(int row, int col) { 
     if (row >= 0 && col < width && col > 0 && 
        row < 20 && (!this.maze[row][col].getState().matches("open"))) { 
      return true; 
     } 
     return false; 
    } 

    public void makeRoute() { 
     Random r = new Random(); 
     int row = 0; 
     int col = r.nextInt(width); 
     maze[row][col].setState("open"); 
     row = row+1; 
     maze[row][col].setState("open"); 

     // System.out.println(this); 
     while (row < (this.height - 1)) { 
      // Assuming the mouse moves in only 3 directions left right or down 
      // in the maze. 0 indicates left turn 1 indicates right turn and 
      // 2 indicates down movement in the maze. 
      int nextDir = r.nextInt(3); 
      switch (nextDir) { 
       case 0: // left turn 
        if (this.isValidTurn(row, (col - 1))) { 
         --col; 
         this.maze[row][col].setState("open"); 
        } 
        break; 
       case 1: // right turn 
        if (this.isValidTurn(row, (col + 1))) { 
         ++col; 
         this.maze[row][col].setState("open"); 
        } 
        break; 
       case 2: // down movement 
        ++row; 
        this.maze[row][col].setState("open"); 
        break; 
      } 
      System.out.println("turn : " + nextDir); 
      // System.out.println(this); 
     } 
     System.out.println(this); 
    } 
} 

class Cell { 
    int row; 
    int col; 
    int above, below, toLeft, toRight; 
    enum state {border, wall, open, travelled}; 
    state state; 

    public Cell(int row, int col){ 
     this.row = row; 
     this.col = col; 
     above = row + 1; 
     below = row -1; 
     toLeft = col -1; 
     toRight = col +1; 
    } 

    @Override 
    public String toString(){ 
     String out = new String(); 
     if (state == state.border) { 
      out = "0"; 
     } 
     if (state == state.wall) { 
      out = "#"; 
     } 
     if (state == state.open) { 
      out = "."; 
     } 
     if (state == state.open) { 
      out = "-"; 
     }  
     return out; 
    } 

    public void setState(String toSet){ 
     switch (toSet){ 
      case "border": 
       state = state.border; 
       break; 
      case "wall": 
       state = state.wall; 
       break; 
      case "open": 
       state = state.open; 
       break; 
      case "travelled": 
       state = state.travelled; 
       break; 
     } 
    } 

    public String getState() { 
     return state.toString(); 
    } 
} 

그러나 다음은

public class MazeFrame extends javax.swing.JFrame { 
    Maze m; 
    /** 
    * Creates new form MazeFrame 
    */ 
    public MazeFrame(Maze m) { 
     this.m = m; 
     setSize(new Dimension(800, 600)); 
     JPanel pan = new JPanel(); 
     add(pan); 
     setVisible(true); 
     // pan.setBackground(Color.yellow); 
     pan.setLayout(new GridLayout(m.width, m.height)); 

     for (int curr = 0; curr < m.height; curr++){ 
      for (Cell c: m.maze[curr]){ 
       JLabel lab = new JLabel(); 
       switch (c.state){ 
        case border: 
         lab.setBackground(Color.black); 
         System.out.println("addedborder"); 
         break; 
        case wall: 
         lab.setBackground(Color.DARK_GRAY); 
         System.out.println("addedwall"); 
         break; 
        case open: 
         lab.setBackground(Color.LIGHT_GRAY); 
         System.out.println("addedopen"); 
         break; 
        case travelled: 
         lab.setBackground(Color.RED);    
       } 
       lab.setSize(new Dimension(50, 50)); 
       lab.setVisible(true);    
       pan.add(lab); 
       // System.out.println("added"); 
      } 
     } 
     pan.revalidate(); 
     pan.repaint(); 
    } 
} 

미로 클래스의 : 여기

내 코드입니다 나는 그것을 실행합니다. 또한 MazeFrame 클래스의 println 문은 각 셀이 해당 상태로 등록되었음을 보여줍니다.

+0

가'로 setVisible (true)가이 – MadProgrammer

+0

단지 그것을 시도 생성자의 마지막에 나타나도록', 여전히이 같은 문제를 이동하려고 ... – drewmoore

+0

당신의 미로 클래스와 셀 클래스도 –

답변

2

코드에 주석을 참조하게했다 떨어져) 생성자의 마지막에 setVisible를 이동 :

public class MazeFrame extends javax.swing.JFrame { 
    Maze m; 
    /** 
    * Creates new form MazeFrame 
    */ 
    public MazeFrame(Maze m) { 
     this.m = m; 
// Don't manually set the size of a frame. Let the preferred size of you components determine the size. 
// This is done by invoking pack() after all components have been added to the frame. 
//  setSize(new Dimension(800, 600)); 
     JPanel pan = new JPanel(); 
     add(pan); 
//  setVisible(true); // do after all components added. 
     // pan.setBackground(Color.yellow); 
     pan.setLayout(new GridLayout(m.width, m.height)); 

     for (int curr = 0; curr < m.height; curr++){ 
      for (Cell c: m.maze[curr]){ 
       JLabel lab = new JLabel(); 
       lab.setOpaque(true); // as suggested by MadProgrammer 
       switch (c.state){ 
        case border: 
         lab.setBackground(Color.black); 
         System.out.println("addedborder"); 
         break; 
        case wall: 
         lab.setBackground(Color.DARK_GRAY); 
         System.out.println("addedwall"); 
         break; 
        case open: 
         lab.setBackground(Color.LIGHT_GRAY); 
         System.out.println("addedopen"); 
         break; 
        case travelled: 
         lab.setBackground(Color.RED);    
       } 
// Set the preferred size so layout managers can do there job 
//    lab.setSize(new Dimension(50, 50)); 
       lab.setPreferredSize(new Dimension(50, 50)); 
// Not required. This is the default for all components except top level containers like JFrame, JDialog 
//    lab.setVisible(true);    
       pan.add(lab); 
       // System.out.println("added"); 
      } 
     } 
// No neeed to revalidate or repaint because the frame is not visible yet 
//  pan.revalidate(); 
//  pan.repaint(); 
     pack(); // let the layout manager determine the size of the frame 
     setVisible(); // show the frame 
    } 
} 

참고 : 일반적으로 각 구성 요소에 기본 크기가 있으므로 구성 요소의 기본 크기를 설정할 필요가 없습니다. 그러나이 경우 텍스트 또는 아이콘을 레이블에 추가하지 않으므로 원하는 크기가되지 않습니다.

2

난 당신이 당신이 어떤 눈에 보이는 컨테이너에 구성 요소를 추가 할 때 다시 칠/유효성을 다시 호출해야합니다, 그래서 당신이 마지막으로 문 프레임에 귀하는, setVisible & 추가 패널을 움직일 수다시피 :

// update panel 
pan.revalidate(); 
pan.repaint(); 

// adding panel to frame 
this.add(pan); 
this.pack(); 
this.setVisible(true); 

당신이 돈 '다른 것 (나는 일을 뭔가를 얻을 수 있었다

lab.setOpaque(true); 
+0

나는 그 모든 것들을 수행했다. (아래쪽에 revalidate/repaint를 옮기고, setOpaque (true)를 추가했다. 여전히 동일한 결과를 가지고있다. – drewmoore

+0

setvisible 전에 pack()을 호출해야한다. –

3

: t는 그것의 기본은, 또한 (기본적으로 때문에 투명) 추가 할 필요가 JLabel의 배경을 변경할 수 있기 때문에 JLabel.setVisible (true)를 호출 할 필요가 그것이 옳은지에 관해서는 또 다른 것입니다. 문제) 기본적으로

enter image description here

모든 I했던합니다 (lab 불투명 ...

public TestMaze(Maze m) { 
    this.m = m; 
    setSize(new Dimension(800, 600)); 
    JPanel pan = new JPanel(); 
    add(pan); 
    pan.setLayout(new GridLayout(m.width, m.height)); 

    for (int curr = 0; curr < m.height; curr++) { 
     for (Cell c : m.maze[curr]) { 
      JLabel lab = new JLabel(); 
      lab.setOpaque(true); // <-- Add me... 
      switch (c.state) { 
       case border: 
        lab.setBackground(Color.black); 
        break; 
       case wall: 
        lab.setBackground(Color.DARK_GRAY); 
        break; 
       case open: 
        lab.setBackground(Color.LIGHT_GRAY); 
        break; 
       case travelled: 
        lab.setBackground(Color.RED); 
      } 
      lab.setSize(new Dimension(50, 50)); 
      lab.setVisible(true); 
      pan.add(lab); 
      // System.out.println("added"); 
     } 
    } 
    setVisible(true); 
} 
+0

+1 for setOpaque(). 모든 스윙 구성 요소 (JLabel 및 JComponent 제외)는 기본적으로 불투명하다고 생각하므로 예외입니다. – camickr

관련 문제