Java Swing GridBagLayout在其他组件之间添加组件

时间:2014-01-24 08:55:51

标签: java swing jscrollpane

我想要实现的目标:我希望能够将组件添加到已添加的组件之间的滚动窗格中。换句话说,我想以某种方式想要将索引向上移动并将旧的组件放在旧的组件中。我创建了一个简短的程序来说明我的问题,它替换了它没有添加它们的组件。有人可以帮忙吗?

为什么我要实现它(回答与此相关的不可避免的问题,如果感兴趣的话,这只是很长时间阅读):我有一个滚动窗格,其中我需要显示大量的组件,大约150000 JTable。这需要太多的内存和处理时间。所以我所做的就是加载带有150000个TextFields的滚动窗格,并且一次只显示100个表格。如果滚动到textfield 200,它将加载接下来的100个表,用表替换先前创建的文本字段。如果您移动到textfield 300,它将加载接下来的100个表,并删除前100个表,再次将其替换为textfields。我在这里的想法是,文本字段的资源密集程度远远低于表格,到目前为止,这种思想似乎是正确的。所以这一切看起来都很好(在我较小的测试文件 - 大约5000条记录)。问题是创建150000文本域也需要很多时间。我想到了解决方案。不为每个表创建文本字段,而是为每100个表创建1个文本字段。这个想法是当你滚动到textfield 2(而不是200)时,它会加载接下来的100个表,用表200到299替换textfield nr 2.所以不知怎的,我需要按顺序移动textfield 3和它下面的所有表插入所有表格。 Phew,希望这是有道理的

所以看下面的例子我真正想要实现的是用5个新的文本字段替换say textfield 20,而不是重新编写文本字段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 个答案:

答案 0 :(得分:0)

任何时候我看到一个像150,000这样的数字我觉得用户不必费心滚动所有这些组件,所以你需要一个更好的用户界面。

无论如何,如果您对GridBagLayout有问题,请不要使用GridBagLayout。

我认为您只是垂直显示组件,因此请尝试BoxLayout。然后,您可以使用add(...)方法指定要删除/添加组件的索引。