2012-09-06 3 views
1

스윙 어플 리케이션에 정말 어려운 디자인 문제가 있습니다. 일반적으로 말하기, JTableJLabel이 표시됩니다. 레이블은 테이블 바로 아래에 있습니다. 스윙 어플리케이션의 JTable 디자인 가이드

  • 이들 두 성분의 높이가 임계, 다음 표와 같은 통상의 라벨 표시를 초과하지

    . 그런 다음 테이블에 채워진 레코드 수가 증가하면이 두 구성 요소의 높이가 증가합니다.
  • 이 두 구성 요소의 높이가 임계 값을 초과하면 테이블에 스크롤 막대가 있고이 두 구성 요소의 높이가 임계 값이되기를 원합니다.

가능한이 디자인인가?

답변

1

스윙 레이아웃의 스크롤 막대 정책을 조정할 수 있습니다 revalidate (행 수가 변경되었는지를 확인하는 TableModelListener를 사용하는 것이 가장 좋습니다)를 호출하십시오. 또한 원하는 크기에 따라 크기를 조정하는 레이아웃이 필요합니다. BorderLayout은 테두리의 구성 요소 (중앙의 구성 요소가 아니라 다른 관리자의 경우 GridBag 이상인 Mig-/Form- 또는 표 (제 3 자) 레이아웃

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class TestTableLayout { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JPanel panel = new JPanel(new BorderLayout()); 
       panel.setPreferredSize(new Dimension(400, 400)); 

       final DefaultTableModel model = new DefaultTableModel(0, 1); 
       JTable table = new JTable(model) { 
        @Override 
        public Dimension getPreferredScrollableViewportSize() { 
// view port size should be the same as the preferred size 
// limited to the height threshold 
         Dimension size = super.getPreferredSize(); 
         size.height = Math.min(size.height, 100); 
         return size; 
        } 
       }; 

       new Timer(1000, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         model.addRow(new Object[] { "Extra row!" }); 
// trigger a relayout of the panel 
         panel.revalidate(); 
         panel.repaint(); 
        } 
       }).start(); 

       panel.add(new JScrollPane(table), BorderLayout.PAGE_START); 

       JLabel label = new JLabel("my label"); 
       label.setVerticalAlignment(JLabel.TOP); 
       panel.add(label, BorderLayout.CENTER); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(panel); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

정말보고 싶습니다 !! 정말 고마워요. – zwang

1

확실히 가능합니다. JTableJScrollPane에 입력하고 스크롤 창의 기본 크기를 설정합니다.

그리고 두 구성 요소를 서로 아래에 넣을 수있는 LayoutManager을 사용하십시오 (예 : BorderLayout). 필요한 경우 그래서 의사 코드에

JPanel container = new JPanel(new BorderLayout()); 

JTable table=...; 
JScrollPane scroll = new JScrollPane(table); 
scroll.setPreferredSize(xxx, xxx); 
container.add(scroll, BorderLayout.CENTER); 

container.add(new JLabel("my label"), BorderLayout.SOUTH); 

, 당신은 원하는 크기 변경, 당신은해야 할 때 자동 레이아웃을 다시하지 않는 스크롤 창

+0

정말 답을 주셔서 감사합니다.하지만이 방법을 사용하는 경우 때문에 sroll.setPreferredSize (XXX, XXX) 방법을 사용할 수 없을 때 그 다음에 충분히 큰 레이블하지 다음 JTable의 크기 JTable 바로 아래에 JTable과 내 레이블 사이에 빈 공간이 있습니다. – zwang

관련 문제