2013-01-14 2 views
2

임. JScrollPane에 여러 JPanel을 표시하려고합니다.높이가 다른 복수의 JPanel을 배열합니다.

패널에는 축소/확장 버튼이있는 머리말 - 부속 패널과 JTable 및 일부 JButton이있는 내용 - 부속 패널이 있습니다.

각 패널의 높이는 패널 내부의 JTable 크기에 의해 결정됩니다.

JScrollPane을 채울만큼 충분한 JPanel이 없으면 나머지 공간은 비어 있어야합니다.

BoxLayout에 대한 나의 접근 방식은 충분한 패널이있는 한 꽤 잘 작동합니다.

TEST_NUMBER_OF_PANELS을 50으로 설정하면 마치 excpeted처럼 작동합니다. TEST_NUMBER_OF_PANELS을 2로 설정하면 패널의 높이가 전체 스크롤 패널을 채우도록 조정됩니다.

swing-x 라이브러리의 JXCollapsiblePane을 content-subpanel로 사용합니다. 패널을 접고 몇 개의 패널 만 보이는 경우 LayoutManager는 항상 동일한 크기를 유지해야하는 header-subpanel의 크기를 조절하기 시작합니다. (내가 잘못 LayoutManager 내 잘못된 사용의 추측 thats 짐작)

다음 SSCCE 외부 라이브러리없이 컴파일합니다. "TODO : un/comment line"을 추가하여 JXCollapsiblePane을 JPanel로 바꿨습니다. (가져 오기, 초기화, 바인딩)

내 LayoutManager가 내 패널을 정렬하는 데 가장 잘 어울리는 것인지 잘 모르겠습니다. LayoutManager를 올바르게 사용했다면 일부 JPanels를 버릴 수도 있습니다. boxContainer 위의 코드에서

JPanel boxContainer = new JPanel(); 
boxContainer.setLayout(new BoxLayout(boxContainer, BoxLayout.Y_AXIS)); 

JPanel boxContainerOuter = new JPanel(); 
boxContainerOuter.setLayout(new BorderLayout()); 
boxContainerOuter.add(boxContainer, BorderLayout.NORTH); 

JScrollPane mainScrollPane = new JScrollPane(boxContainerOuter); 

:

당신은 단지 가능한 크기 ( TestTabContent() 내부 코드)를 줄여 다른 레이아웃으로 패널을 캡슐화 할 수 있습니다 사전

package test; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.util.Random; 
import java.util.Vector; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

// TODO: uncomment line 
//import org.jdesktop.swingx.JXCollapsiblePane; 

public class Test extends JFrame { 
    private static final int TEST_NUMBER_OF_PANELS = 50; 
    private static JTabbedPane tabbedPane = new JTabbedPane(); 
    Test() { 
     this.setLayout(new BorderLayout()); 
     this.setSize(1050, 700); 
     this.setMinimumSize(new Dimension(400,200)); 
     this.add(tabbedPane, BorderLayout.CENTER); 

     tabbedPane.addTab("tab1", new TestTabContent()); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test().setVisible(true); 
      } 
     }); 
    } 

    private class TestTabContent extends JPanel { 
     TestTabContent() { 
      JPanel boxContainer = new JPanel(); 
      boxContainer.setLayout(new BoxLayout(boxContainer, BoxLayout.Y_AXIS)); 
      JScrollPane mainScrollPane = new JScrollPane(boxContainer); 

      // create toolbar 
      JPanel toolBar = new JPanel(); 
      toolBar.setLayout(new BorderLayout()); 

      //east 
      JPanel InfoPanel = new JPanel(); 
      InfoPanel.setLayout(new BoxLayout(InfoPanel, BoxLayout.X_AXIS)); 
      InfoPanel.add(new JLabel("test: some info ...")); 
      toolBar.add(InfoPanel, BorderLayout.WEST); 
      //west 
      JPanel viewOptionPanel = new JPanel(); 
      viewOptionPanel.setLayout(new BoxLayout(viewOptionPanel, BoxLayout.X_AXIS)); 
      viewOptionPanel.add(new JLabel("some controls..")); 
      toolBar.add(viewOptionPanel, BorderLayout.EAST); 

      // set main panel´s layout 
      GroupLayout layout = new GroupLayout(this); 
      this.setLayout(layout); 
      layout.setHorizontalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
        .addComponent(toolBar, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .addComponent(mainScrollPane) 
        ); 
      layout.setVerticalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
          .addComponent(toolBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
          .addGap(0, 0, 0) 
          .addComponent(mainScrollPane, GroupLayout.DEFAULT_SIZE, 413, Short.MAX_VALUE)) 
        ); 

      // create controls 4 test ... 
      for (int i = 0; i < TEST_NUMBER_OF_PANELS; i++) { 
       TestPanel newTestPanel = new TestPanel(); 

       // seperator panels for spacing 
       JPanel seperator = new JPanel(new BorderLayout()); 
       seperator.setBackground(Color.black); 
       seperator.add(newTestPanel); 

       boxContainer.add(seperator); 
      } 
     } 
    } 
    private class TestPanel extends JPanel { 
     //private static final Icon COLLAPSE_ICON = new ImageIcon(Test.class.getResource("images/collapse_1616.png")); 
     //private static final Icon EXPAND_ICON = new ImageIcon(Test.class.getResource("images/expand_1616.png")); 
     private JTable table; 
     private DefaultTableModel tableModel; 
     private JButton collapsingButton; 

     // TODO: uncomment line 
     //private JXCollapsiblePane collapsiblePane = new JXCollapsiblePane(); 
     // TODO: comment line 
     private JPanel collapsiblePane = new JPanel(); 

     public TestPanel() { 

      this.setLayout(new BorderLayout()); 

      this.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

      // container with boxLayout for collapsiblePane 
      JPanel boxContainer = new JPanel(); 
      boxContainer.setLayout(new BoxLayout(boxContainer, BoxLayout.Y_AXIS)); 
      boxContainer.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK)); 

      // set table stuff 
      tableModel = new DefaultTableModel(); 
      // column headers 
      Vector<String> title = new Vector<String>(); 
      title.add("A"); 
      title.add("B"); 
      title.add("C"); 
      title.add("D"); 
      // some random data 
      Random randomGenerator = new Random(); 
      int rnd = randomGenerator.nextInt(10) + 1; 
      Vector<Vector<String>> data = new Vector<Vector<String>>(); 
      Vector<String> row = new Vector<String>(); 
      for (int i=0; i<rnd; i++) { 
       row.add("1"); 
       row.add("2"); 
       row.add("3"); 
       row.add("4"); 
       data.add(row); 
      } 
      tableModel.setDataVector(data, title); 
      table = new JTable(tableModel); 

      boxContainer.add(table.getTableHeader(), BorderLayout.NORTH); 
      boxContainer.add(table, BorderLayout.CENTER); 

      // other controls/toolbar 
      JPanel toolbar = new JPanel(); 
      toolbar.setLayout(new BorderLayout()); 

      // buttons to the right 
      JPanel toolbarButtonGroup = new JPanel(); 
      toolbarButtonGroup.setLayout(new BoxLayout(toolbarButtonGroup, BoxLayout.X_AXIS)); 

      // Button1 
      JButton button = new JButton("Button1"); 
      JPanel sepPanel = new JPanel(); 
      sepPanel.add(button); 
      toolbarButtonGroup.add(sepPanel); 

      // Button2 
      button = new JButton("Button2"); 
      sepPanel = new JPanel(); 
      sepPanel.add(button); 
      toolbarButtonGroup.add(sepPanel); 

      // Button3 
      button = new JButton("Button3"); 
      sepPanel = new JPanel(); 
      sepPanel.add(button); 

      toolbarButtonGroup.add(sepPanel); 

      toolbar.add(toolbarButtonGroup, BorderLayout.EAST); 
      boxContainer.add(toolbar); 

      JPanel subPanel = new JPanel(); 
      subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.Y_AXIS));   

      // add panel with collapse/expand button 
      JPanel buttonPanel = new JPanel(); 
      buttonPanel.setLayout(new BorderLayout()); 
      buttonPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 24)); 

      collapsingButton = new JButton("foo"); // , COLLAPSE_ICON 
      collapsingButton.setName("toggleButton"); 
      collapsingButton.setHorizontalAlignment(SwingConstants.LEFT); 
      collapsingButton.setBorderPainted(false); 
      collapsingButton.setFocusPainted(false); 

      buttonPanel.add(collapsingButton, BorderLayout.CENTER); 
      buttonPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

      subPanel.add(buttonPanel); 

      collapsiblePane.setName("collapsiblePane"); 
      collapsiblePane.setLayout(new CardLayout()); 

      collapsiblePane.add(boxContainer, ""); 
      subPanel.add(collapsiblePane); 

      add(subPanel); 

      // TODO: uncomment line 
      //collapsingButton.addActionListener(collapsiblePane.getActionMap().get( 
      //  JXCollapsiblePane.TOGGLE_ACTION)); 
     } 
    } 
} 

답변

2

에 감사합니다 다른 패널 boxContainerOuter에 포함되어 있습니다. 레이아웃 및 위치 (BoxLayout.NORTH)는 외부 컨테이너가 포함 된 패널을 축소하도록 선택됩니다.

+0

thx 많이 있습니다. 매력처럼 작동합니다. – user1952204

관련 문제