2010-03-04 6 views
3

Java 응용 프로그램에서 일부 구성 요소의 크기를 조정하는 데 문제가 있습니다. 메인 JFrame의 크기를 조정할 때 주변 구성 요소를 채우지 않고 이전 크기로 유지합니다.JScrollPane 및 JTabbedPane 크기 조정 문제

예를 들어, 내 프로그램에 JTabbedPane (다른 JTabbedPane의 탭 (기본 JFrame 내에 있음)) 내에있는 JTabbedPane이 있습니다. 나는 탭을 내부 JTabbedPane에 추가하여 다양한 .setPreferredSize()를 통해 전체 주변 공간을 채 웁니다. 그리고 나서 창 모서리를 드래그하여 JFrame의 크기를 조정하면 바깥 쪽 JTabbedPane의 탭이 잘 조정되지만 그 안에있는 JTabbedPane은 동일한 이전 크기로 유지됩니다.

JScrollPane으로 테스트 할 때와 동일한 일이 발생합니다. JScrollPane에 의해 바뀐 외부 JTabbedPane은 같은 크기를 유지합니다.

다음은 내가 놓친 명백한 것을 볼 수 있도록 탭 패널을 만드는 코드입니다. JFrame의 크기를 조정할 때 크기를 변경하지 않는 것보다 createEndGamePane()의 tabPane/jsp 객체입니다. mainTabPane은 필요한대로 크기를 조정합니다.

class MyFrame extends JFrame { 
    private JTabbedPane mainTabPane; 
    private JPanel endGameInfo; 
    //.... 

    private void createTabbedCenterPane(){ 
     this.mainTabPane = new JTabbedPane(); 

     this.endGameInfo = new JPanel(); 

     this.createEndGamePane(); 

     this.mainTabPane.addTab("Turneringschema", null, this.scheduleHolder, "Spelschemat för turneringen"); 
     this.mainTabPane.addTab("Grupper & Pooler", null, this.poolInfo, "Information om grupper, lag och pooler"); 
     this.mainTabPane.addTab("Slutspelsträd", null, this.endGameInfo, "Information om slutspelen"); 

     this.add(this.mainTabPane, BorderLayout.CENTER); 
    } 

    private void createEndGamePane(){ 
     JTabbedPane tabPane = new JTabbedPane(); 
     tabPane.setPreferredSize(this.endGameInfo.getSize()); 

     for (int i = 0; i < this.tournament.data.getGroups().size(); i++) { 
      EndGame e = this.tournament.data.getEndGames().get(i);; 

      //Create the gameTree 
      EndGameTreeCanvas gameTree = new EndGameTreeCanvas(e, this.endGameInfo.getSize()); 

      //Create the ScrollPane 
      JScrollPane jsp = new JScrollPane(gameTree); 
      jsp.setPreferredSize(tabPane.getSize()); 
      jsp.setBorder(BorderFactory.createEmptyBorder()); 


      //Add to the endGameIndo panel 
      tabPane.addTab(this.tournament.data.getGroups().get(i).getName(), jsp); 
     } 

     this.endGameInfo.add(tabPane); 
    } 

} 

답변

1

구성 요소의 크기를 동적으로 조정하려면 스윙의 크기를 말하면 안됩니다. 대신, 이것에 대해 :

JTabbedPane tabs = new JTabbedPane(); 
JScrollPane inner1 = new JScrollPane(myOtherComponent); 
tabs.add("Scroll", inner1); 
JTabbedPane inner2 = new JTabbedPane(); 
tabs.add("Tabs", inner2); 

그리고 그게 전부입니다. No setPreferredSize().

0

당신은 스윙 레이아웃 튜토리얼을 읽어야 할 사람 : http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html

내가 선호하는 레이아웃 매니저는 최대의 유연성 (http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html)를 허용하는 GridBagLayout에 있습니다.

특히 주변의 사용 가능한 공간을 구성 요소가 모두 채우도록하려면 BorderLayout.CENTER를 사용하지 않아야합니다.

GridBagLayout로 관리자와 예 : 다른 사람이 말했다

this.add(this.mainTabPane, 
    new GridBagConstraints(
    0,0, // position 
    1,1, // size 
    1.0,1.0, // fill ratio 
    GridBagConstraints.CENTER, GridBagConstraints.BOTH, // position inside the cell 
    new Insets(2,2,2,2),0,0)); // margins 
+0

BorderLayout.CENTER는 공간을 채우기 위해 사용됩니다. –

0

, 당신이 당신의 GUI의 레이아웃 요구 사항을 처리하기 위해 layout managers를 사용해야합니다.

그러나 기본 레이아웃 관리자는 MatrixLayout, MigLayout, TableLayout 또는 기타 무료 숫자 중 하나와 같은 표 기반 레이아웃을 사용하는 것이 좋습니다.

테이블 기반 레이아웃을 사용하면 요구되는 레이아웃 중첩의 양이 크게 줄어들 기 때문에 GUI 코딩이 약 정도 단순 해집니다. 나는 나의 GUI의 90 %가 하나의 레이아웃 매니저로 이루어지고, 나머지 10 %는 자바가 제공하는보다 간단한 레이아웃 매니저를 사용한다는 것을 알게되었다.

나는 결코 GridBagLayout을 사용하지 않았으며 나는 절대 을 추천하지 않았다.은 그것을 권장하지 않는다 - 불필요하게 복잡하고 지속적인 유지 보수를 어렵게 만든다.