我想要实现的目标:我希望能够将组件添加到已添加的组件之间的滚动窗格中。换句话说,我想以某种方式想要将索引向上移动并将旧的组件放在旧的组件中。我创建了一个简短的程序来说明我的问题,它替换了它没有添加它们的组件。有人可以帮忙吗?
为什么我要实现它(回答与此相关的不可避免的问题,如果感兴趣的话,这只是很长时间阅读):我有一个滚动窗格,其中我需要显示大量的组件,大约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++;
}
}
}
}
答案 0 :(得分:0)
任何时候我看到一个像150,000这样的数字我觉得用户不必费心滚动所有这些组件,所以你需要一个更好的用户界面。
无论如何,如果您对GridBagLayout有问题,请不要使用GridBagLayout。
我认为您只是垂直显示组件,因此请尝试BoxLayout
。然后,您可以使用add(...)
方法指定要删除/添加组件的索引。