2014-01-24 47 views
1

我想實現的目標:我希望能夠將組件添加到已添加的組件之間的滾動窗格中。換句話說,我想以某種方式移動索引,並在原來的舊組件上放置一些新的組件。我創建了一個簡短的程序來說明我的問題,它取代了它不添加它們的組件。有人可以幫忙嗎?我有一個滾動窗格,其中我需要顯示大量的組件,大約150000個JTables。爲什麼我想實現它?這需要太多的內存和處理時間。因此,我所做的是將滾動窗格加載150000個TextFields,並且一次只顯示100個表格。如果滾動到文本框200,它將加載下100個表格,用表格替換先前創建的文本字段。如果您移動到文本框300,它會加載下100個表格,並刪除前100個,再次用文本框替換它。我在這裏想到的是,文本域將比表格更節省資源,迄今爲止這種想法似乎是正確的。所以這一切似乎工作得很好(在我的較小的測試文件 - 約5000個記錄)。問題在於要創建150000個文本字段還需要很多時間。我想到了一個解決方案。不爲每個表創建文本字段,而是爲每100個表創建1個文本字段。這個想法是,當你滾動到textfield 2(而不是200)時,它會加載下100個表格,將textfield nr 2替換爲200到299的表格。因此,我需要將textfield 3和其下的所有文本字段按順序移動插入所有的表格。唷,希望這是有道理Java Swing GridBagLayout在其他組件之間添加組件

所以在看下面我想有效實現的例子就是更換說文本框20與5個新的文本框,但不repalce文本框的21 - 25

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

    public class Example { 
    public static void main(String args[]) { 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       ExampleScreen ex = null; 
        ex = new ExampleScreen(); 
        ex.setVisible(true); 
      } 
     }); 
    } 

    private static class ExampleScreen extends JFrame{ 

     GridBagConstraints gc = new GridBagConstraints(); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     JScrollPane scrollPane = new JScrollPane(panel); 

     public ExampleScreen() { 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
      this.add(scrollPane, BorderLayout.CENTER); 
      setupFields(); 
      createExtraFieldsInbetween(20); 
      this.pack(); 
      scrollPane.getVerticalScrollBar().setUnitIncrement(16); 
      scrollPane.getViewport().setScrollMode(JViewport.BLIT_SCROLL_MODE); 
     }  

     //after this happens i need to add components somewhere in the middle, like after textfield 20 for example 
     private void setupFields() {  
      gc.gridy = 0; 
      gc.gridx = 0; 
      for(int k = 0; k < 50; k++) { 
       JTextField textField = new JTextField(); 
       textField.setPreferredSize(new Dimension(1500,36)); 
       textField.setText(new Integer(k).toString()); 
       panel.add(textField, gc, k); 
       gc.gridy++; 
      } 
     } 

     //this is to create extra fields inbetween those already created 
     //this does not work, it overwrites the existing components, doesnt move them up 
     private void createExtraFieldsInbetween(int i) {  
      gc.gridy = i;  
      //create 5 extra 
      for(int k = i; k < i + 5; k++) { 
       JTextField textField = new JTextField(); 
       textField.setPreferredSize(new Dimension(1500,36)); 
       textField.setText("Extra Field : " + new Integer(k).toString()); 
       panel.add(textField, gc, k); 
       gc.gridy++; 
      } 
     } 
    } 
} 
+1

您是否想過使用CardLayout來分頁?或者只有一行15萬行的JTable?我不禁感到,如果你從不同的角度思考原始需求,你正在努力解決自己製造的問題,這可能不存在! – ninesided

+0

單個JTable想法+1。 – splungebob

回答

0

每當我看到一個像150,000這樣的數字我認爲用戶不會困擾於瀏覽所有這些組件,因此您需要更好的用戶界面。

無論如何,如果您遇到GridBagLayout問題,請不要使用GridBagLayout。

它在我看來像你只是垂直顯示組件,所以試試BoxLayout。然後,您可以使用add(...)方法來指定要刪除/添加組件的索引。