2012-09-06 45 views
1

我的鞦韆應用程序中有一個非常困難的設計問題。一般來說,我有一個JTable和一個JLabel來顯示。表格正下方是標籤。鞦韆應用程序中的JTable設計指南

  • 當這兩個部件的高度不超過,則該表和標籤顯示爲正常。隨着表中記錄的數量增加,這兩個組件的高度將會增加。
  • 當這兩個組件的高度超過閾值時,我希望表格中有一個滾動條,這兩個組件的高度將成爲閾值。

這是設計可能

回答

1

Swing佈局的滾動條政策不會自動重新排版時,首選大小的變化,你必須調用重新驗證(最好使用TableModelListener來檢查行數是否已更改)。您還需要一個根據其首選大小來設置組件大小的佈局,BorderLayout可以爲組件在邊框中執行此操作(但不適用於中間的組件)。對於不同的管理器,您需要GridBag或更好的Mig-/Form-或表(第三方)佈局

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

這當然是可能的。將JTable放入JScrollPane,您可以在其中設置滾動窗格的首選大小。

並使用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