【问题标题】:Java Swing GridBagLayout adding components inbetween other componentsJava Swing GridBagLayout 在其他组件之间添加组件
【发布时间】:2014-01-24 08:55:50
【问题描述】:

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

我为什么要实现它(回答与此相关的不可避免的问题,如果有兴趣,请阅读这篇文章):我有一个滚动窗格,我需要在其中显示很多组件,大约150000 个 JTable。这需要太多的内存和处理时间。所以我所做的是用 150000 个文本字段加载滚动窗格,一次只显示 100 个表。如果滚动到文本字段 200,它会加载接下来的 100 个表格,用表格替换之前创建的文本字段。如果您移动到文本字段 300,它会加载接下来的 100 个表格,并删除前 100 个表格,再次将其替换为文本字段。我在这里的想法是,文本字段将比表格占用更少的资源,到目前为止,这种想法似乎是正确的。所以这一切似乎都运行良好(在我较小的测试文件中 - 大约 5000 条记录)。问题是创建 150000 个文本字段也需要很多时间。我想到了一个解决方案。不要为每个表创建一个文本字段,而是为每 100 个表创建一个文本字段。这个想法是,当您滚动到文本字段 2(而不是 200)时,它会加载接下来的 100 个表格,将文本字段 nr 2 替换为表格 nr 200 - 299。所以我需要以某种方式将文本字段 3 及其下方的所有内容按顺序向下移动插入所有表格。呼,希望这是有道理的

所以看看下面的例子,我实际上想要实现的是用 5 个新的文本字段替换说文本字段 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++;
            }
        }
    }
}

【问题讨论】:

  • 您是否考虑过使用 CardLayout 对结果进行分页?还是只有一个 150,000 行的 JTable?我不禁觉得你在努力解决一个你自己制造的问题,如果你从不同的角度考虑最初的需求,可能就不存在了!
  • +1 表示单个 JTable 的想法。

标签: java swing jscrollpane


【解决方案1】:

每当我看到像 150,000 这样的数字时,我认为用户不会费心滚动浏览所有这些组件,因此您需要更好的 UI。

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

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

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多