2012-02-21 4 views
1

아래의 테스트 코드에 대한 몇 가지 질문 ... 게시 할 전체 작업 프로그램이 없지만 사람들이 스윙을 할 정도로 스윙을 알기를 바랍니다. 그것. 이것은 JPanel (BoxLayout) 내부의 JLabel이며, 오른쪽 아래의 레이블 크기 조정 작업을하고 있습니다.Java Swing 구성 요소 상호 작용 (BoxLayout 및 Label)

표시된 코드와 함께 얻은 것은 300x30 높이의 상태 상자입니다. 내가 선호하는 크기와 레이블의 최소 크기로 만져 보았고 어떤 합리적 인 방식으로도 행동하지 않는 것 같습니다.

  1. JPanel 기본 크기가 너비에는 영향을 미치지 만 너비는 이 아닌 이유는 무엇입니까? setPreferredSize()의 x 치수를 0 또는 500으로 변경하면 여전히 레이블에서 300이 나옵니다.
  2. JLabel 최소 크기가 폭에 영향을 미치지 만 높이가 이 아닌 이유는 무엇입니까? setPreferredSize() 호출에 주석을 달고 레이블 높이를 30으로 늘리면 아무 일도 일어나지 않습니다.
  3. JPanel setMinimumSize (주석 처리)로 시작했지만 더 이상 효과가 없습니다. 왜 JPanel에 setPreferredSize()가 필요합니까?
  4. 레이블 텍스트를 ""에서 ""로 변경하면 레이블의 높이가 늘어납니다. 라벨이 높이를 제어하지 않기 때문에 왜 이것이 전혀 효과가 있습니까?

그런데 createRigidArea() 호출은 화면의 왼쪽을 고집하지 않고 구분 기호를 오른쪽으로 강제 이동하는 것입니다. 이것에 대한 덜 불쾌한 아이디어가 있다면, 나는 감사 할 것입니다.

private JComponent makeStatusBarTest() { 
    JPanel statusPanel = new JPanel(); 
    statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.LINE_AXIS)); 
    statusPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
// statusPanel.setMinimumSize(new Dimension(0, 30)); 
    statusPanel.setPreferredSize(new Dimension(500, 30)); 
    JLabel statusLabel = new JLabel(); 
    Border emptyBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10); 
    statusLabel.setBorder(emptyBorder); 
    statusLabel.setText(""); 
    statusLabel.setMinimumSize(new Dimension(300, 20)); 
    statusPanel.add(statusLabel); 
    statusPanel.add(new JSeparator(SwingConstants.VERTICAL)); 
    statusPanel.add(Box.createRigidArea(new Dimension(5000,0))); 

    return statusPanel; 
} 
+1

"전체 프로그램"을 표시하지 마십시오. 그러나 동일한 토큰에 문제를 컴파일하고 실행하여 보여 주며 [sscce] (http://sscce.org)가 도움이 될 것입니다. 당신을 훨씬 잘 도와 줄 수 있습니다. –

+3

@orbfish 제발 무엇이 새로운지 Dimension (5000,0))); '당신이 칠하고 싶고 높이가 0 인 모니터 (세 개를 세어도 좋습니다) – mKorbel

+0

@HovercraftFullOfEels - 새로운 sscce 종교가있는 것 같습니다. 그것에 연결. 나는 일하는 프로그램을 게시 할 수 없다고 말했다. – orbfish

답변

2

나는 # 1과 # 2 설명 할 수있다 :이 BoxLayout의 javadoc에서

는 "BoxLayout는 수평 레이아웃의 경우는 그 선호 폭의 구성 요소 또는 (수직 레이아웃) 높이를 마련하려고합니다." 즉

는, BoxLayout에서는이 을 결정 (귀하의 경우, statusLabel에서) 내부 구성 요소를 사용하지만 JPanel의 (이유 이내) 자체는 높이을 결정.

일반적으로 RigidArea 대신 Glue를 사용하여 물건을 옮길 수 있지만 익숙해지는 데는 동의합니다.

# 4가 너무 효율적입니다. JLabel이 비어 있으면 텍스트 사각형은 0x0입니다. 궁극적으로 SwingUtilities.layoutCompoundLabelImpl()에서 결정됩니다.

# 3은 BoxLayout이 내부 구성 요소의 기본 크기를 고려하기 때문에 발생한다고 생각합니다. 아마 setMinimumSize가 선호하는 크기를 오버라이드 (override)하기 때문입니다.

+0

답변 해 주셔서 감사합니다. 따라서 BoxLayout의 기본 가로 레이아웃은 크기 조정을 내부 컴포넌트로 위임하고 있습니다. 그나저나 접착제를 사용해 봤는데 아무런 효과가 없었고 뭔가 빠뜨린 것 같습니다. 여전히 PreferredSize와 MinimumSize를 얻지는 못하지만, 이는 구성 요소 별 또는 레이아웃 별 레이아웃 인 것처럼 보이므로 사용자는 절대로이를 파악하지 못할 수 있습니다. – orbfish

+0

minimumSize를 설정 한 다음 사용자가 패널의 크기를 minimumSize로 조정하면 패널이 더 이상 구성 요소의 기본 너비를 "존중 (honor)"할 수 없습니다. 그것이 내가 그것에 대해 생각하는 방법입니다. 하지만 실제로 어떤 일이 진행되고 있는지 잘 모르겠습니다. :-) – user949300