2014-03-29 4 views
0

나는 스윙을 배우려고 노력 중이며 (다른 StackOverflow 코드의 도움으로) 패널을 만들었습니다. 프레임에 바둑판 모양의 디자인을 추가했지만 프레임 크기가 그렇게 크지 않은 것으로 나타났습니다.JPanel이 왜 그렇게 작아야합니까?

@Override 
    protected void paintComponent(Graphics g) { 
     int width = getWidth(), height = getHeight(); 
     g.clearRect(0, 0, width, height); 
     g.setColor(Color.BLACK); 

     for (int i=0;i<=width;i+=50) { 
      g.drawLine(0,i,width,i); 
     } 
     for (int i=0;i<=height;i+=50) { 
      g.drawLine(i,0,i,height); 
     } 
     label.setText("H = "+ getHeight() +" W = "+ getWidth()); // check actual size 
     add(label); 
    } 

    private void gui(Pan window) { 
     frame = new JFrame(); 
     Container container = frame.getContentPane();  
     container.add(window); 
     frame.setSize(400, 400); // size written here 
     frame.setVisible(true); 
    } 

당신이 그것을 실행하면 윈도우의 크기를 볼 수 있습니다 :

여기 내 코드입니다. 코드에 쓰여진대로 400x400 대신 362x384가됩니다. 내가 500에 의해 500 크기를 변경하는 경우

, 윈도우가 484

Q에 의해 462있을 것입니다 : 왜 38과 16로 떨어져 치수는? 프레임의 크기는 타이틀 바와 테두리를 포함하므로

+1

자바는 테두리에 인세 트를 추가합니다. http://stackoverflow.com/questions/2451252/swing-set-jframe-content-area-size – blueygh2

답변

5

은 400

의해 384 362 대신 400 것이다. setSize() 메서드를 사용하지 마십시오.

대신 사용자 패널의 getPreferredSize() 메서드를 재정 의하여 패널 크기를 반환하십시오.

은 그럼 당신은 사용

frame.pack(); 

그런 다음 프레임의 크기가 패널의 적절한 사이즈에, 제목 표시 줄 및 테두리의 크기가됩니다.

+0

'getPrefferedSize()'를 오버라이드하는 것이 효과적입니다! 400의 치수를 400으로 반환하면 윈도우가 올바른 크기가됩니다. 그러나'setResizable (false)'를 추가하면 410에 410이됩니다. – Chronicle

+1

@Chronicle, setResizable()은 프레임을 패킹하기 전에 수행되어야합니다. 프레임은 여전히 ​​크기를 조정할 수있는 Border의 테두리가 5 픽셀이라고 가정합니다. 경계선이 없으므로 여분의 공간이 패널로 이동합니다. – camickr