我想實現的目標:我希望能夠將組件添加到已添加的組件之間的滾動窗格中。換句話說,我想以某種方式移動索引,並在原來的舊組件上放置一些新的組件。我創建了一個簡短的程序來說明我的問題,它取代了它不添加它們的組件。有人可以幫忙嗎?我有一個滾動窗格,其中我需要顯示大量的組件,大約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++;
}
}
}
}
您是否想過使用CardLayout來分頁?或者只有一行15萬行的JTable?我不禁感到,如果你從不同的角度思考原始需求,你正在努力解決自己製造的問題,這可能不存在! – ninesided
單個JTable想法+1。 – splungebob