2011-10-06 2 views
0

Java 응용 프로그램의 일부로 대화 상자를 만들고 있습니다. 그루비의 swingBuilder를 사용하고 있는데 JDialog를 팩하려고 할 때 약간의 어려움을 겪고 있습니다. 아래 코드를 참조하십시오 :GridLayout이 포함 된 JPanel로 JDialog를 패킹하려면 어떻게해야합니까?

import groovy.swing.SwingBuilder 
import javax.swing.* 

swing = new SwingBuilder() 

swing.edt{ 
    frame(id: 'mainFrame', title: 'Test', size: [200,200], visible: true, locationRelativeTo: null, resizable: false){ 
    panel{ 
     button('Click me', actionPerformed: {createAssessmentCategoryDialog()}) 
     } 
    } 
} 

public JPanel createAssessmentCategoryPanel(){ 
    swing.panel(id: 'assessmentCategoryPanel'){ 
     panel{ 
      panel(layout: gridLayout(rows:2, cols:2, hgap:4, vgap:4)){ 
       label("Category Name", horizontalAlignment: JLabel.RIGHT) 
       textField(id: 'categoryName', columns: 12) 
       button('Save & add another', actionPerformed:{saveAssessmentCategoryInfo()}).toolTipText = 'Saves and clears field' 
       button('Close', actionPerformed:{assessmentCategoryDialog.visible = false}).toolTipText = 'Closes dialog without saving' 
      } 
     } 
    } 
    return swing.assessmentCategoryPanel 
} 

public void createAssessmentCategoryDialog(){ 
    assessmentCategoryDialog = new JDialog(swing.mainFrame, "Add Assessment Category", true) 
    assessmentCategoryDialog.resizable = false 
    assessmentCategoryDialog.defaultCloseOperation = JDialog.DISPOSE_ON_CLOSE 
    assessmentCategoryDialog.contentPane.add(createAssessmentCategoryPanel()) 
    assessmentCategoryDialog.pack() 
    assessmentCategoryDialog.locationRelativeTo = swing.mainFrame 
    assessmentCategoryDialog.visible = true 
} 

이 코드를 Groovy 콘솔에 붙여 넣으면 잘 실행되어야합니다. 'click me'버튼을 클릭하면 대화 상자 아래에 여분의 공간이 생깁니다.

레이블, 텍스트 필드 및 두 개의 버튼이있는 그리드 레이아웃입니다. 괜찮아 보이지만 대화 상자를 꾸리려고하면 문제가 생깁니다. 그것은 잘 포장하지만 바닥에 여분의 공간 (GridLayout에서 추가 행처럼)이 있습니다. 대화 상자가 이상하게 보입니다. 이 문제를 GridLayout으로 좁혔습니다. 구성 요소의 행을 하나만 추가하면 잘 포장되기 때문입니다. 격자를 완전히 제거하고 다른 임의의 구성 요소를 추가하면 잘 포장됩니다. 나는 대체 레이아웃 관리자를 시도 할 수 있지만 GridLayout은 GridBag와 같이 너무 많은 코드 없이는 잘 작동한다는 것을 알고있다. 그래서 다른 솔루션이 없다면 GridLayout을 고수 할 것입니다.

JDialog에서 setSize() 메서드를 사용하면 대화 상자의 크기가 조정되지만 다른 테마와 플랫폼에서도 잘 수행되지 않습니다. 나는 오히려 pack()을 사용하여 모든 플랫폼의 크기를 조정할 것입니다. 도움을 주셔서 미리 감사드립니다.

+0

1) 더 빨리 도움을 받으려면 [SSCCE] (http://pscode.org/sscce.html)를 게시하십시오. 2) 귀하의 질문은 무엇입니까? 그것을 알아 내면 게시물로 편집하십시오. –

+0

감사합니다. SSCCE에서 작동합니다. – Mark

답변

1

GridLayout 사용을 중지하고 다른 레이아웃으로 전환하십시오. GridLayout은 각 셀의 크기가 동일하므로 축구 공으로 유용합니다. 따라서 새로운 스포츠를 만들고 싶지 않으면 유용하지 않을 것입니다. GridBagLayout을 선택할 수는 있지만 좌절감을 느낍니다. 나는 TableLayout을 얻는 것이 좋습니다.

http://java.sun.com/products/jfc/tsc/articles/tablelayout/

는 그것은 훨씬 더 생산의 LayoutManager입니다. 어떤 방법 으로든 Sun LayoutManagers보다 유용합니다. Groovy가 어떻게 동작하는지 모르겠지만, Groovy는 특별한 통합을 필요로하지 않고 이러한 클래스를 사용할 수있는 것처럼 보이므로 잘하면 그걸 잡아서 떨어 뜨리고 작동시킬 수 있습니다.

귀하의 pack() 문은 의도 한대로 작동한다고 생각하지만 레이아웃 관리자를 잘못 선택했다고 생각합니다. 이 값을 수정하면 setSize()가 작동하는 것을 볼 수 있습니다. 모든 pack()은 구성 요소의 기본 크기를 계산하고 대화 상자의 크기를 그 크기로 설정합니다. 다만, JDialog의 사이즈를 설정하면 (자), 컴퍼넌트는, LayoutManager가 컴퍼넌트에 공간을 배치하는 방법에 따라 간단하게 레이아웃을 설정합니다. 각각의 구성 요소가 대화 상자의 크기를 결정하는 아래쪽과 아래쪽과 다른 크기의 정렬은 대화 상자가 여기에 표시되는 크기이고 아래쪽 구성 요소는 대화 상자의 크기를 결정합니다. 당신의 즐거움을 위해

는 : http://madbean.com/anim/totallygridbag/ chubbard에 의해 제안

+0

안녕하세요 고마워요. 조금만 고쳐 줘서 고마워요. 나는 다른 누구보다 아래에 더 자세하게 게시 할 것이다. – Mark

+0

MigLayout을 사용하면 매우 편리합니다. – JamesC

1

, 나는 GridLayout과를 사용하여 종료하고 TableLayout을 사용했다. 라이브러리는 아래의 URL에서 훌륭한 문서와 함께 무료 :

http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/

거의 모든 레이아웃을 달성하는 것은이 레이아웃 관리 가능 보이지만 익숙해 동안 조금했다. jar, 문서 및 API에 대해서는 위의 URL을 참조하십시오. 다시 주버 어 감사합니다.

그리고 groovy는 특별한 통합없이 클래스를 사용할 수 있습니다. 오랫동안 친숙한 UI를 사용하여 UI 구성 요소, 레이아웃 등을 그루비 코드로 쉽게 변환 할 수 있습니다. 그래서 나는 그렇게했다. 단지 참고 사항 : groovy로 변환 할 수 없더라도 .groovy 파일에 일반 Java를 작성하는 것은 완벽합니다.Groovy가 당신에게 그루비 한 방법을 강요하지 않습니다 :)

+0

좋은 후속 조치. 고마워. – chubbsondubs

관련 문제