2013-02-04 3 views
0

스크롤 막대가있는 JPanel에 여러 개의 확인란을 추가하는 대화 상자가 구현되었습니다. 각 프로그램 실행마다 확인란 수가 고정되어 있지는 않지만 대화 상자를 만들기 전에 확인란을 선택합니다. 내가 대화 상자를 추가 할 수있는 체크 박스의 수가 많은 경우Scrollpane보다 큰 JPanel

불행하게도 다음과 같습니다

enter image description here

내 코드는 다음과 같습니다

 JPanel listPanel = new JPanel(new GridLayout(files.size() + 2, 1)); 

     for (int i = 0; i < files.size(); i++) { 
      listPanel.add(files.get(i)); 
     } 

     listPanel.setPreferredSize(new Dimension(600, 1400)); 
     JScrollPane sp = 
       new JScrollPane(listPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
         JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     sp.setPreferredSize(new Dimension(300, 200)); 

     mainPanel.add(sp, BorderLayout.CENTER); 
     mainPanel.add(buttonPane, BorderLayout.EAST); 

     getContentPane().setLayout(new FlowLayout()); 

     getContentPane().add(mainPanel); 

     pack(); 
     setResizable(false); 

난 그냥의 크기를 설정하는 방법 프레임에 영향을 미치지 않으면 서 더 큰 크기의 Scrollpane 안의 패널?

답변

3

setPreferredSize을 사용하지 않도록하자 레이아웃 매니저는 그들이 실제로 필요로하는 크기 ...

예와 업데이트를 결정 스크롤 창의의 JViewport이 결정하기 위해 listPane의 추천 사이즈를 사용

얼마나 많은 볼 수있는 공간이 필요한지는 ... 많이 있습니다.

이 문제를 해결하려면 구성 요소가 실제로 볼 수있는 가시 크기에 대해보기 포트에 대한 더 나은 힌트를 제공해야합니다 있다. 구성 요소의 preferredSize 여기서 일하지 않을, 내가이 예에서 어떤 임의의 매직 넘버를 사용하면 '한 nb- Scrollable 인터페이스

enter image description here

public class BadList { 

    public static void main(String[] args) { 
     new BadList(); 
    } 

    public BadList() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      List<String> files = new ArrayList<>(2000); 
      for (int index = 0; index < 2000; index++) { 
       files.add(Integer.toString(index)); 
      } 

      ListPane listPanel = new ListPane(); 
      listPanel.setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.weightx = 1; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      for (String file : files) { 
       listPanel.add(new JCheckBox(file), gbc); 
      } 

      JScrollPane sp = new JScrollPane(listPanel); 

      JPanel mainPanel = new JPanel(new BorderLayout()); 
      JPanel buttonPane = new JPanel(new GridBagLayout()); 
      buttonPane.add(new JButton("Select All"), gbc); 
      buttonPane.add(new JButton("Deselect All"), gbc); 
      gbc.weighty = 1; 
      buttonPane.add(new JPanel(), gbc); 

      mainPanel.add(sp, BorderLayout.CENTER); 
      mainPanel.add(buttonPane, BorderLayout.EAST); 

      setLayout(new BorderLayout()); 

      add(mainPanel); 
     } 
    } 

    public class ListPane extends JPanel implements Scrollable { 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return false; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 

    } 
} 

에서 preferredScrollableViewportSize를 제공해야 당신의 필요

+0

을 게시 할 수 있습니다. ScrollPane에 PreferredSize를 사용하지 않으면 모든 항목이 스크롤 막대없이 표시됩니다. 그리고 JPanel에 PreferredSize를 사용하는지 여부는 아무런 차이가 없습니다. 결과는 같습니다. – schmimona

+0

@chchimimona 죄송합니다, 예제 작업;) – MadProgrammer

3
  • JPanel을위한보다 현실적인 값을 제공 무엇겠다,

    구현했습니다
  • FlowLayoutPreferredSize을 받아, 다음 JScrollPane 제대로 누워있다

  • 사용 JTable (scroll increment을 변경해야 non_natural 스크롤) (JCheckBox를 대표하는이 Boolean value을 넣어) 대신 JPanel에 차일을 추가

  • listPanel.setPreferredSize(new Dimension(600, 1400));이 좋지 않음 Dimmension,이 코드 줄을 주석으로 처리하여 pack()

  • 이 작업 (코드는 여기에 게시) 내가 대신 사용 mainPanel()의 직접 JFrameJScrollPanebuttonPane을 넣어 것에 대한

    , 그렇지 않으면 그것은 작동하지 않는 SSCCE

+0

JTable을 언급 한 +1 – MadProgrammer