JTable dynamisch Zeilen hinzufügen und entfernen: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(Die Seite wurde neu angelegt: „Mit folgendem Code kann man, ähnlich wie in Excel Zeilen dynamisch beim Scrollen in die JTable einfügen oder auch leere, nicht benutzte Zeilen wieder löschen. …“)
 
K
Zeile 7: Zeile 7:
 
import javax.swing.*;
 
import javax.swing.*;
 
import javax.swing.table.*;
 
import javax.swing.table.*;
 +
 
public class DynamicRows extends JFrame implements AdjustmentListener {
 
public class DynamicRows extends JFrame implements AdjustmentListener {
private JScrollPane jScrollPane1;
 
private JTable jTable1;
 
private DefaultTableModel model;
 
private int yVisible, yVisibleOld;
 
private boolean valueIsAdjusting = false;
 
public DynamicRows() {
 
super("DynamicRows");
 
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
setSize(400, 300);
 
setLocationRelativeTo(null);
 
jScrollPane1 = new JScrollPane();
 
jTable1 = new JTable();
 
jTable1.setModel(new DefaultTableModel(
 
new Object[][]{},
 
new String[]{
 
"Title 1", "Title 2", "Title 3", "Title 4"
 
}));
 
jScrollPane1.setViewportView(jTable1);
 
getContentPane().add(jScrollPane1, BorderLayout.CENTER);
 
model = (DefaultTableModel) jTable1.getModel();
 
for (int i = 0; i < 20; i++) {
 
model.addRow(new Object[]{null, null, null, null});
 
  
}
+
    private JScrollPane jScrollPane1;
 +
    private JTable jTable1;
 +
    private DefaultTableModel model;
 +
    private int yVisible, yVisibleOld;
 +
    private boolean valueIsAdjusting = false;
 +
 
 +
    public DynamicRows() {
 +
        super("DynamicRows");
 +
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 +
        setSize(400, 300);
 +
        setLocationRelativeTo(null);
 +
        jScrollPane1 = new JScrollPane();
 +
        jTable1 = new JTable();
 +
        jTable1.setModel(new DefaultTableModel(
 +
                new Object[][]{},
 +
                new String[]{
 +
                    "Title 1", "Title 2", "Title 3", "Title 4"
 +
                }));
 +
        jScrollPane1.setViewportView(jTable1);
 +
        getContentPane().add(jScrollPane1, BorderLayout.CENTER);
 +
        model = (DefaultTableModel) jTable1.getModel();
 +
        for (int i = 0; i < 20; i++) {
 +
            model.addRow(new Object[]{null, null, null, null});
 +
 
 +
        }
 +
 
 +
        jScrollPane1.getVerticalScrollBar().addAdjustmentListener(this);
 +
    }
  
jScrollPane1.getVerticalScrollBar().addAdjustmentListener(this);
+
    public void adjustmentValueChanged(final AdjustmentEvent e) {
}
+
        if (e.getValueIsAdjusting()) {
public void adjustmentValueChanged(final AdjustmentEvent e) {
+
            valueIsAdjusting = true;
if(e.getValueIsAdjusting()){
+
            return;
valueIsAdjusting = true;
+
        }
return ;
+
        Adjustable a = e.getAdjustable();
}
+
        Rectangle rectBottom = jTable1.getCellRect(model.getRowCount() - 1, 0, true);
Adjustable a = e.getAdjustable();
+
        int yBottom = rectBottom.y + rectBottom.height;
Rectangle rectBottom = jTable1.getCellRect(model.getRowCount()-1, 0, true);
+
        Rectangle rectVisible = jTable1.getVisibleRect();
int yBottom = rectBottom.y + rectBottom.height;
+
        yVisible = rectVisible.y + rectVisible.height;
Rectangle rectVisible = jTable1.getVisibleRect();
+
        //if we are scrolling upwards:
yVisible = rectVisible.y + rectVisible.height;
+
        if (yVisible != 0 && yVisible < yVisibleOld) {
//if we are scrolling upwards:
+
            //remove all invisible rows if they area empty (from bottom to top):
if (yVisible != 0 && yVisible < yVisibleOld) {
+
            boolean remove = true;
//remove all invisible rows if they area empty (from bottom to top):
+
            for (int row = jTable1.getRowCount() - 1; row > -1; row--) {
boolean remove = true;
+
                if (jTable1.getCellRect(row, 0, true).y > yVisible) {//if row is invisible
for (int row = jTable1.getRowCount() - 1; row > -1; row--) {
+
                    for (int column = 0; column < jTable1.getColumnCount(); column++) {
if (jTable1.getCellRect(row, 0, true).y > yVisible) {//if row is invisible
+
                        Object value = jTable1.getValueAt(row, column);
for (int column = 0; column < jTable1.getColumnCount(); column++) {
+
                        if (value != null) {//if the row is not empty
Object value = jTable1.getValueAt(row, column);
+
                            remove = false;//do not remove any more rows
if (value != null) {//if the row is not empty
+
                        }
remove = false;//do not remove any more rows
+
                    }
}
+
                    if (remove) {
}
+
                        model.removeRow(row);
if (remove) {
+
                    }
model.removeRow(row);
+
                }
}
+
            }
}
+
        } else {
}
 
} else {
 
 
//here we are scrolling downwards
 
//here we are scrolling downwards
//if visible area is at bottom:
+
            //if visible area is at bottom:
if ((yBottom == yVisible)) {
+
            if ((yBottom == yVisible)) {
if(valueIsAdjusting){
+
                if (valueIsAdjusting) {
valueIsAdjusting = false;
+
                    valueIsAdjusting = false;
rectVisible.y = rectVisible.y - 2;
+
                    rectVisible.y = rectVisible.y - 2;
yVisible = yVisible - 2;
+
                    yVisible = yVisible - 2;
jTable1.scrollRectToVisible(rectVisible);
+
                    jTable1.scrollRectToVisible(rectVisible);
}
+
                } else {
else{
+
                    a.removeAdjustmentListener(this);
a.removeAdjustmentListener(this);
+
                    //add new row and scroll to visible:
//add new row and scroll to visible:
+
                    model.addRow(new Object[]{null, null, null, null});
model.addRow(new Object[]{null, null, null, null});
+
                    rectBottom = jTable1.getCellRect(model.getRowCount() - 1, 0, true);
rectBottom = jTable1.getCellRect(model.getRowCount() - 1, 0, true);
+
                    rectBottom.height = rectBottom.height - 1;
rectBottom.height = rectBottom.height - 1;
+
                    jTable1.scrollRectToVisible(rectBottom);
jTable1.scrollRectToVisible(rectBottom);
+
                    a.addAdjustmentListener(this);
a.addAdjustmentListener(this);
+
                }
}
+
            }
}
+
        }
}
+
        yVisibleOld = yVisible;
yVisibleOld = yVisible;
 
  
}
+
    }
public static void main(final String args[]) {
+
 
EventQueue.invokeLater(new  
+
    public static void main(final String args[]) {
Runnable() {
+
        EventQueue.invokeLater(new Runnable() {
public void run() {
+
            public void run() {
new DynamicRows().setVisible(true);
+
                new DynamicRows().setVisible(true);
}
+
            }
});
+
        });
}
+
    }
 
}
 
}
 
</code=java>
 
</code=java>
Zeile 101: Zeile 104:
 
[[Kategorie:JTable]]
 
[[Kategorie:JTable]]
 
[[Kategorie:Java-Codeschnipsel]]
 
[[Kategorie:Java-Codeschnipsel]]
 +
 +
Basieren auf einem Codebeispiel von Marco13

Version vom 27. Mai 2014, 11:19 Uhr

Mit folgendem Code kann man, ähnlich wie in Excel Zeilen dynamisch beim Scrollen in die JTable einfügen oder auch leere, nicht benutzte Zeilen wieder löschen.

<code=java> import java.awt.*; import java.awt.event.*;

import javax.swing.*; import javax.swing.table.*;

public class DynamicRows extends JFrame implements AdjustmentListener {

   private JScrollPane jScrollPane1;
   private JTable jTable1;
   private DefaultTableModel model;
   private int yVisible, yVisibleOld;
   private boolean valueIsAdjusting = false;
   public DynamicRows() {
       super("DynamicRows");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
       setSize(400, 300);
       setLocationRelativeTo(null);
       jScrollPane1 = new JScrollPane();
       jTable1 = new JTable();
       jTable1.setModel(new DefaultTableModel(
               new Object[][]{},
               new String[]{
                   "Title 1", "Title 2", "Title 3", "Title 4"
               }));
       jScrollPane1.setViewportView(jTable1);
       getContentPane().add(jScrollPane1, BorderLayout.CENTER);
       model = (DefaultTableModel) jTable1.getModel();
       for (int i = 0; i < 20; i++) {
           model.addRow(new Object[]{null, null, null, null});
       }
       jScrollPane1.getVerticalScrollBar().addAdjustmentListener(this);
   }
   public void adjustmentValueChanged(final AdjustmentEvent e) {
       if (e.getValueIsAdjusting()) {
           valueIsAdjusting = true;
           return;
       }
       Adjustable a = e.getAdjustable();
       Rectangle rectBottom = jTable1.getCellRect(model.getRowCount() - 1, 0, true);
       int yBottom = rectBottom.y + rectBottom.height;
       Rectangle rectVisible = jTable1.getVisibleRect();
       yVisible = rectVisible.y + rectVisible.height;
       //if we are scrolling upwards:
       if (yVisible != 0 && yVisible < yVisibleOld) {
           //remove all invisible rows if they area empty (from bottom to top):
           boolean remove = true;
           for (int row = jTable1.getRowCount() - 1; row > -1; row--) {
               if (jTable1.getCellRect(row, 0, true).y > yVisible) {//if row is invisible
                   for (int column = 0; column < jTable1.getColumnCount(); column++) {
                       Object value = jTable1.getValueAt(row, column);
                       if (value != null) {//if the row is not empty
                           remove = false;//do not remove any more rows
                       }
                   }
                   if (remove) {
                       model.removeRow(row);
                   }
               }
           }
       } else {

//here we are scrolling downwards

           //if visible area is at bottom:
           if ((yBottom == yVisible)) {
               if (valueIsAdjusting) {
                   valueIsAdjusting = false;
                   rectVisible.y = rectVisible.y - 2;
                   yVisible = yVisible - 2;
                   jTable1.scrollRectToVisible(rectVisible);
               } else {
                   a.removeAdjustmentListener(this);
                   //add new row and scroll to visible:
                   model.addRow(new Object[]{null, null, null, null});
                   rectBottom = jTable1.getCellRect(model.getRowCount() - 1, 0, true);
                   rectBottom.height = rectBottom.height - 1;
                   jTable1.scrollRectToVisible(rectBottom);
                   a.addAdjustmentListener(this);
               }
           }
       }
       yVisibleOld = yVisible;
   }
   public static void main(final String args[]) {
       EventQueue.invokeLater(new Runnable() {
           public void run() {
               new DynamicRows().setVisible(true);
           }
       });
   }

} </code=java>

Basieren auf einem Codebeispiel von Marco13