2014-01-24 45 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(...)方法来指定要删除/添加组件的索引。