2017-04-05 8 views
-1

JPanel에 문제가 있습니다. 무슨 일이 일어나지 않습니다. 그래서 나는 GamePanel이라는 커스텀 JPanel을 생성하는 init 함수를 가진 JFrame을 가지고 있는데 이상한 일은 객체에 페인트를 사용하더라도 결코 paintComponents 함수에 들어 가지 않는다는 것입니다. 여기 자바 스윙 JPanel paintComponents가 호출되지 않았습니다

내가 (JFrame의 단위) 인 JPanel을 초기화 할 때 내 코드입니다 :

this.gamePanel = new GamePanel(this.grid, this); 
this.panel.add(this.gamePanel, constraints); 

을 그리고 JPanel의 자체 :

public class GamePanel extends JPanel { 

    private final int SQUARE_SIZE = 50; 

    private Grid grid; 
    private final GameView gameView; 

    public GamePanel(Grid grid, GameView gameView) { 
     this.gameView = gameView; 

     this.setPreferredSize(new Dimension(200, 200)); 
    } 

    public void setGrid(Grid grid) { 
     this.grid = grid; 
     this.setPreferredSize(new Dimension(grid.getSizeX() * SQUARE_SIZE, grid.getSizeY() * SQUARE_SIZE)); 
    } 

    @Override 
    public void paintComponents(Graphics g) { 
     System.out.println("test"); 

     if (this.grid != null) { 

      Graphics2D g2 = (Graphics2D) g; 

      double thickness = 3; 
      g2.setStroke(new BasicStroke((float) thickness)); 

      g2.setColor(Color.BLACK); 

      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        int x = SQUARE_SIZE * i; 
        int y = SQUARE_SIZE * j; 

        g2.drawRect(x, y, SQUARE_SIZE, SQUARE_SIZE); 

        if(this.grid.getSquareState(x, y) != 0) { 
         char[] tmp = ("" + this.grid.getSquareState(x, y)).toCharArray(); 
         g2.drawChars(tmp, 0, 1, x, y); 
        } 
       } 
      } 
     } 
    } 
} 

편집 : (전체 JFrame의)

public class GameView extends JFrame { 

    private CustomSocket socket; 
    private JPanel panel; 
    private GamePanel gamePanel; 
    private JLabel listPlayers; 
    private JLabel playerPlaying; 
    private Grid grid; 

    public GameView(CustomSocket socket) { 
     this.socket = socket; 
     this.setTitle("TicTacToe - Client"); 

     this.setSize(600, 480); 

     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     this.init(); 
     this.pack(); 
     this.setVisible(true); 
     this.play(); 
    } 

    private void init() { 
     this.panel = new JPanel(); 
     this.panel.setLayout(new GridBagLayout()); 

     GridBagConstraints constraints =new GridBagConstraints(); 
     constraints.fill = GridBagConstraints.CENTER; 

     constraints.gridx = 0; 
     constraints.gridy = 0; 
     constraints.gridwidth = 1; 

     // Grid 
     this.gamePanel = new GamePanel(this.grid, this); 
     this.panel.add(this.gamePanel, constraints); 

     // Labels 
     constraints.gridy += 1; 
     this.listPlayers = new JLabel(); 
     this.panel.add(this.listPlayers, constraints); 

     constraints.gridy += 1; 
     this.playerPlaying = new JLabel(); 
     this.panel.add(this.playerPlaying, constraints); 

     this.setContentPane(this.panel); 
    } 

    private void play() { 
     String[] tmp = this.socket.getData().split(";"); 

     this.grid = new Grid(Integer.parseInt(tmp[0]), Integer.parseInt(tmp[1])); 

     String players = ""; 
     for(int i = 2; i < tmp.length; i++) { 
      players += tmp[i] + " "; 
     } 

     this.listPlayers.setText(players); 

     boolean notFinished = true; 
     while(notFinished) { 
      String[] gridData = this.socket.getData().split(";"); 
      for(int i = 1; i < gridData.length; i++) { 
       String[] gridRow = gridData[i].replace("(", "").replace(")", "").split(","); 


       for(int j = 0; j < gridRow.length; j++) { 
        this.grid.setSquareState(i - 1, j, Integer.parseInt(gridRow[j])); 
       } 
      } 

      this.gamePanel.repaint(); 

      String playerPlaying = this.socket.getData().split(";")[0]; 

      if(playerPlaying != this.socket.getUsername()) { 
      } 
      notFinished = true; 
     } 
    } 
} 

미리 감사드립니다.

+2

paintComponents가 아닌 paintComponent를 사용합니다. – ControlAltDel

+0

두 기능을 모두 시도했지만 불행히도 작동하지 않습니다. –

+0

왜 [7 질문] (http://stackoverflow.com/users/6743005/florian-merle)인지, ** ** 하나만 허용 대답이 있습니까? 너를 위해 일하지 않니? –

답변

2
this.panel.add(this.gamePanel, constraints); 

패널에 구성 요소를 추가했지만 패널에 원하는 크기가 없습니다. 크기가 (0, 0)이므로 페인트 할 것이 없으므로 메서드가 호출되지 않습니다.

모든 스윙 구성 요소는 자신이 원하는 크기를 결정합니다. 사용자 지정 구성 요소의 getPreferredSize() 메서드를 재정의하십시오. 그런 다음 레이아웃 관리자는 구성 요소의 적절한 크기/위치를 설정할 수 있습니다.

paintComponent(...)은 올바른 방법이며 super.paintComponent(...)을 첫 번째 문구로 사용하여 배경이 지워지는 것을 잊지 마십시오.

+0

글쎄, getPreferredSize() 메소드를 추가해도 문제가 해결되지 않았지만, 치수를 변경하면 윈도우가 커지게됩니다. –

+0

편집 : 원래 게시글의 JFrame에서 전체 코드를 추가했습니다. –

+0

@FlorianMerle 두 번 지금 작성한 마지막 지점을 놓쳤습니다. 또한 소켓이 문제를 일으키는 지 누가 알 수 있습니다. 어쩌면 코드가 입력을 기다리는 것을 막을 수도 있습니다. 논리 흐름이 올바른지 확인하기 위해 더 많은 디버깅을 수행하십시오. – camickr