2012-03-09 2 views
3

여기에 크기가 조정됩니다 너희들 힘든 일 : JScrollPane의 무작위

은 기본적으로 내가 2 열이있는 GridBagLayout에있는 것입니다 : 각각의 스크롤에 싸여 목록은. 스크롤 팬은 BOTH 방향으로 늘어납니다. 나는 점진적으로 (윈도우의 가장자리를 드래그하여)이 패널의 높이를 줄일 경우

, 내가 볼 "임의의"스크롤 구획에서 일어나는 크기 조정 : 최초의이 hscroll 줄이

을 나타날 때

  • 초 하나의 폭이 감소됩니다 다음, 두 번째의 폭이 아무 이유없이 다시 수축됩니다

  • ...

난 내 구성 요소를 포장하지 않는 경우,이 behavi을하지 않습니다 또는. 당신이 나무과 오른쪽 목록을 대체하는 경우


, 그것은 다르게 동작합니다 : 를 윈도우의 높이가 380-ICH 픽셀 노호, 나무는 크기가 조정됩니다 축소 ...

만약 내가 돈 내 구성 요소를 래핑하지 않으면 창의 크기를 계속 유지하면 나무 크기가 조정됩니다!

너희들은 무슨 일이 일어나고 있는지 알 수 있니?

추신 : 빌드하려고하는 실제 레이아웃은이 예제보다 더 복잡합니다. 다음, 당신을 anchor을 정의 그 동안 내가 원하는 것을 할 SpringLayout에를 사용하지만이 GridBagLayout의 기본 원칙입니다

protected static ListModel newListModel(int n) { 
    DefaultListModel lm = new DefaultListModel(); 

    for (int i = 0; i < n; ++i) 
     lm.addElement("AAA"); 

    return lm; 
} 

protected static JComponent createContentPane() { 
    JPanel pane = new JPanel(new GridBagLayout()); 

    GridBagConstraints gbc = new GridBagConstraints(); 

    gbc.anchor = GridBagConstraints.CENTER; 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.weightx = 1; 
    gbc.weighty = 1; 
    gbc.gridy = 0; 
    gbc.gridx = 0; 

    pane.add(new JScrollPane(new JList(newListModel(12))), gbc); 

    ++gbc.gridx; 

    pane.add(new JScrollPane(new JList(newListModel(4))), gbc); 

    return pane; 
} 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 

    f.getContentPane().add(createContentPane()); 
    f.setSize(800, 400); 
    f.setLocationRelativeTo(null); 
    f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    f.setVisible(true); 
} 

답변

2
  • 는, 당신이 잊고 설치에 많은 (너무 아름답 지) 일에 필요 rellative Poin톤에 JComponent을 배치 해결할 수, 나는,
( nested layout를 사용하지 않고)이 LayoutManager는 하나 개의 컨테이너에 JComponents 많이 배치하기위한보다 효율적으로 사용하고, GridBagLayout이 GUI를 복잡하게 생각 할 수 있습니다 복잡 간단한 일

에 대해 피하는 예를

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class BorderPanels extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public BorderPanels() { 
     setLayout(new GridBagLayout());// set LayoutManager 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JPanel panel1 = new JPanel(); 
     Border eBorder = BorderFactory.createEtchedBorder(); 

     panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct")); 
     gbc.gridx = gbc.gridy = 0; 
     gbc.gridwidth = gbc.gridheight = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.anchor = GridBagConstraints.NORTHWEST; 
     gbc.weightx = gbc.weighty = 20; 
     add(panel1, gbc); // add compoenet to the COntentPane 

     JPanel panel2 = new JPanel(); 
     panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "60pct")); 
     gbc.gridy = 1; 
     gbc.weightx = gbc.weighty = 60; 
     //gbc.insets = new Insets(2, 2, 2, 2); 
     add(panel2, gbc); // add component to the COntentPane 

     JPanel panel3 = new JPanel(); 
     panel3.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct")); 
     gbc.gridy = 2; 
     gbc.weightx = gbc.weighty = 20; 
     gbc.insets = new Insets(2, 2, 2, 2); 
     add(panel3, gbc); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important 
     pack(); 
     setVisible(true); // important 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { // important 

      public void run() { 
       BorderPanels borderPanels = new BorderPanels(); 
      } 
     }); 
    } 
} 

에 대한

+0

내 예제에서는 앵커가 설정되어 있습니다. 내가 센터를 선택 하든지 아니면 어떤 코너 (북서쪽)를 선택하든이 문제는 여전히 발생합니다. 내 예에서는 최종 버전의 모든 내용이 표시되지 않습니다. 나는 그 글을 위해 그것을 단순화했다. 실제로는 좀 더 복잡합니다. – Jordan

+0

@Jordan은 적절한 LayoutManager를 사용합니다. GridBagLayout은 대부분의 compex LayoutManager이며 가능한 모든 매개 변수를 허용합니다. BoxLayout 또는 BorderLayout을 suply하고 싶습니다. 둘 중 하나를 선택하는 것이 좋습니다. – mKorbel

9

GridBagLayout에 여러 개의 ScrollPane이있는 응용 프로그램이 있으며 창 크기를 조정하면 갑자기 크기가 조정됩니다. ScrollPane의 실제 크기가 "preferred size"를 넘을 때 점프가 발생하는 것 같습니다.해결 방법을 찾았습니다 : 기본 크기를 1x1 픽셀로 설정하십시오. 구성 요소에 양수가 있고 양쪽 모두가 늘어나도 여전히 전체 셀을 차지하지만 점프하지는 않습니다. 다른 크기로 크기를 조정하기 위해 여러 개의 셀이 필요한 경우 다른 셀의 기본 크기 (예 : 2x1 픽셀)를 설정할 수 있습니다.

+0

흥미 롭습니다. 나를. – Jordan

+0

와우, 그건 내 문제를 해결했습니다. 나는 비슷한 문제가 있었다. 스크롤바가 오른쪽 아래에 놓여있는 4x4 격자가있었습니다. 내 제약 조건은 오른쪽 상단 셀에 가중치를, 왼쪽 상단 셀에 수직 가중치를 부여하는 것이 었습니다. 다른 모든 셀의 가중치 0입니다. 내가 얻고 자했던 것은 컨테이너를 포함하는 대화 상자를 확장하면 맨 위 셀만 확장되어 맨 아래쪽에 스냅 된 채로 남아있게됩니다. 모의 패널에서는 정상적으로 작동했지만, 오른쪽 아래 셀을 jscrollpne으로 설정하면 크기가 크게 변경되었습니다. 그래서 우선 크기를 1,1로 설정했습니다. 갑작스러운 점프는 더 이상 발생하지 않습니다. –

+0

나는이 솔루션에 대해 당신을 사랑합니다. –