Tabellen Spalte löschen

A

acdc

Gast
Hallo,

Ich habe folgendes Problem:

mit den Zeilen:
Java:
 public void mousePressed(MouseEvent e)
    {
      if(e.getButton()==MouseEvent.BUTTON3)  //nur wenn die rechte Maustaste gedrückt wird
      {
        JTableHeader th = (JTableHeader)e.getSource();
        Point p = e.getPoint();
        int col = th.columnAtPoint(p);
                      
        InputDialog input=new InputDialog();
        input.viewDialog();
        System.out.println(col);

        if(input.getValue())
        {
          th.getColumnModel().getColumn(col).setHeaderValue(input.getText());         
          th.resizeAndRepaint();

          newData=tableModel.getColumnIdentifiers(); //Eigene Methode in OwnTableModel "return columnIdentifiers"
          newData.setElementAt(input.getText(),col); // neuer Text aus eigenem Dialog
       }
      }
    }

ändere ich die Spaltennamen.

Nach der Änderung lösche ich genau diese, eben umbenannte Spalte mit:

Java:
      int selCol=Tabelle1.getSelectedColumn();
    
      Vector headers;
      headers=modelTabelle1.getColumnIdentifiers();
      headers.removeElementAt(selCol);

      int index = Tabelle1.convertColumnIndexToView(selCol);
      if (index != -1)
        Tabelle1.getColumnModel().removeColumn(Tabelle1.getColumnModel().getColumn(index));

Dabei erscheind folgende Meldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Vector.java:430)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(BasicTableHeaderUI.java:654)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:670)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:646)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JViewport.paint(JViewport.java:747)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


Lösche ich jedoch eine andere Spalte, so funktioniert das einwandfrei.
Da werden vielleicht in den Tiefen von JTabel oder so Werte micht richtig übernommen!?
Ich habe sonst absolut keine Idee, warum das sein könnte.

Hat jemand einen Vorschlag?

DANKE

acdc
 

Ebenius

Top Contributor
Frage: Warum benennt man eine Spalte um, um sie anschließend zu löschen?

Das (oder: Ein) Problem ist, dass Du mit dem Modell im Code-Block 2 Zeile 5 falsch umgehst. Wenn aus Sicht des Tabellenmodells die Spaltenanzahl verändert wird, muss das Modell alle Zuhörer mit einem entsprechenden Event benachrichtigen (structure changed). Ansonsten verhält es sich falsch. Damit hat Dein Fehler in jedem Fall zu tun.

Ebenius
 
A

acdc

Gast
@Ebenius
Der Benutzer hat ja viele Einfälle und so muss ich das Programm so schreiben, dass es ihm Stand hält!

habs nun mal mit
Java:
      Vector headers;
      headers=modelT1.getColumnIdentifiers();
      System.out.println(headers.toString());
      headers.removeElementAt(selCol);
      modelT1.fireTableStructureChanged();

versucht.

habs auch mit
Java:
      Vector headers=new Vector();
      headers=modelT1.getColumnIdentifiers();
      headers.removeElementAt(selCol);
      modelT1.setColumnIdentifiers(headers);
versucht, da wird ja auch ein StructureChange ausgeführt.

Leider weis ich nicht mit welchen Methoden ich sehen kann wo etwas nicht stimmt. Ich habe auch alle möglichen getColumnCounts
(Tabelle1.getColumnCount();Tabelle1.getColumnModel().getColumnCount();) ausgegeben und die waren immer richtig und gleich.


Vielleicht wird nicht sauber umbenannt? Leider finde ich keine andere Möglichkeit Spalten umzubenennen.

acdc
 

Ebenius

Top Contributor
Oh da fällt mir auf: im Code-Block 2 in Deinem ersten Beitrag in Zeile 7 konvertierst Du die selektierte Spalte. [c]selCol[/c] ist doch bereits eine Angabe in der View, die kann man nicht nochmal konvertieren. Probier's mal so aus:
Java:
      int selCol=Tabelle1.getSelectedColumn();

      final TableColumnModel cm = Tabelle1.getColumnModel();
      cm.removeColumn(cm.getColumn(selCol));

      Vector headers;
      headers=modelTabelle1.getColumnIdentifiers();
      headers.removeElementAt(selCol);
      modelTabelle1.fireTableStructureChanged();
Ist autoCreateColumnsFromModel [c]false[/c]? Wenn nicht, dann kannst Du Dir die Zeilen 3 und 4 auch sparen.

Ebenius
 
A

acdc

Gast
autoCreateColumnsFromModel ist true;

Habe daher die 2 Zeilen auch weggelassen und nur

Java:
      Vector headers;
      headers=modelTabelle1.getColumnIdentifiers();
      headers.removeElementAt(selCol);
      modelTabelle1.fireTableStructureChanged();

probiert.

-> keine Änderung.

liegt es vielleicht an der Methode wie ich den Spaltennamen ändere? Bibt es eine bessere bzw. Richtigere? Gei Google hab ich bis jetzt noch Nichts gefunden. Hat es vielleicht mit irgendeinem Eventlistener zutun? - Wenn ich debugge (ich benutze Netbeans) wird das fireActionPerformed() (JAbstrcatButton) ausgeführt - fragt glaub ich alle Listener ab - dann gibt irgendwann diese Exception bei

at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)

...weis nicht... der Debugger hilft mir hier, denk ich, nicht weiter.

danke für die Antworten

acdc
 

Ebenius

Top Contributor
Hier mal ein Beispiel (KSKB) wie das Löschen funktioniert. Ich würde in jedem Fall der Tabelle verbieten, das ColumnModel selbst zu erzeugen. Ansonsten werden die Spaltennamen zurück gesetzt, veränderte Spaltenbreiten gehen verloren und die Spaltenreihenfolge wird auch zurück gesetzt, wenn man eine Spalte löscht.

Java:
/* (@)TableColumnRemoveFun.java */

/* Copyright 2010 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.Vector;

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

public class TableColumnRemoveFun {

  private static class MyTableModel extends DefaultTableModel {

    private static final long serialVersionUID = 1L;

    MyTableModel(int rowCount, int columnCount) {
      super(rowCount, columnCount);

      // fix the column names
      final String[] columnNames = new String[columnCount];
      for (int i = 0; i < columnCount; i++) {
        columnNames[i] = getColumnName(i);
      }
      setColumnIdentifiers(columnNames);
    }

    @SuppressWarnings("unchecked")
    public void removeColumn(int columnIndex) {
      columnIdentifiers.remove(columnIndex);

      for (int i = columnIndex; i < getColumnCount(); i++) {
        ((Vector<Object>) dataVector.get(i)).remove(i);
      }
      fireTableStructureChanged();
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final JTable table = new JTable(new MyTableModel(5, 5));
    table.createDefaultColumnsFromModel();
    table.setAutoCreateColumnsFromModel(false);

    table.getTableHeader().addMouseListener(new MouseAdapter() {

      @Override
      public void mouseClicked(MouseEvent e) {
        if (SwingUtilities.isLeftMouseButton(e)) {
          final JTableHeader source = (JTableHeader) e.getComponent();
          final Window root = SwingUtilities.getWindowAncestor(source);
          final int mods = e.getModifiersEx();
          final String name;
          final int columnIndex = source.columnAtPoint(e.getPoint());
          if (columnIndex == -1) {
            return;
          }
          final JTable table = source.getTable();
          final TableColumnModel cm = table.getColumnModel();
          final TableColumn column = cm.getColumn(columnIndex);
          final int modelCol = table.convertColumnIndexToModel(columnIndex);

          // set column header value
          if ((mods & InputEvent.SHIFT_DOWN_MASK) != 0
                && (name =
                      JOptionPane.showInputDialog(root,
                            "Enter new Column Name")) != null) {
            column.setHeaderValue(name);
            source.resizeAndRepaint();
          }

          // delete column
          if ((mods & InputEvent.CTRL_DOWN_MASK) != 0) {
            cm.removeColumn(column);

            // need to fix all column model indices beyond the deleted column
            for (Enumeration<TableColumn> all = cm.getColumns(); all
                  .hasMoreElements();) {
              final TableColumn tmp = all.nextElement();
              if (tmp.getModelIndex() > modelCol) {
                tmp.setModelIndex(tmp.getModelIndex() - 1);
              }
            }

            // remove the column from the data model
            ((MyTableModel) table.getModel()).removeColumn(modelCol);
          }
        }
        super.mouseClicked(e);
      }
    });

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new JLabel("<html>SHIFT+Click: Rename Column<br>"
          + "CTRL+Click: Remove Column"), BorderLayout.NORTH);
    contentPane.add(new JScrollPane(table), BorderLayout.CENTER);

    final JFrame f = new JFrame("Test Frame: TableColumnRemoveFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Der Grund warum Dein Code oben nicht richtig funktioniert hat wahrscheinlich mit den Zeilen 99-106 in meinem Beispiel zu tun.

Ich hoffe das hilft. Happy Hacking!

Ebenius
 
A

acdc

Gast
Danke für dein Beispiel - jetzt funktionierts!

was bei mir nun genau der Fehler war hab ich nicht ganz heraus gefunden - vielleicht weil ich über einen Butten und einer markierten Zeile eine Spalte löschen wollte.

Nachdem ich nicht Stunden für ein Problem verbrauchen will habe ich nun mit Hilfe deines Codes die Klasse JTable und was so dazu gehört besser verstehen gelern und einfach meine Methoden neu geschrieben!

-es funktioiniert jetzt und ich finde es hat auch noch vorteile, weil man bei der Gestaltung der Tabelle etwas flexibler ist!

danke (echt super, diese positive Erfahrung hatte ich noch nie in einem Forum)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
D MySQL-Tabellen in GUI anzeigen AWT, Swing, JavaFX & SWT 8
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
S Swing Tabellen - Listener & richtige Row AWT, Swing, JavaFX & SWT 3
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
R Swing Tabellen updaten AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
T Swing 2 Tabellen parallel sortieren? (synchronisieren) AWT, Swing, JavaFX & SWT 3
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
K Tabellen Inhalt ( Zelle ) Modifizieren AWT, Swing, JavaFX & SWT 2
M Markieren von ganzen Zeilen in transparenten Tabellen AWT, Swing, JavaFX & SWT 6
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
M gleicher TableCellRenderer für mehrere unterschiedliche Tabellen AWT, Swing, JavaFX & SWT 5
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
D Tabellen Header & Abstand der Zeilen AWT, Swing, JavaFX & SWT 8
S SWT Zwei Tabellen gleichzeitig Scrollen AWT, Swing, JavaFX & SWT 3
D Swing Tabellen-Namen im ListSelectionListener abfragen AWT, Swing, JavaFX & SWT 2
A Tabellen Überschriften ändern -setColumnIdentifiers()- Fehler AWT, Swing, JavaFX & SWT 7
M SWT SWT - Zwei Tabellen gleicher Größe AWT, Swing, JavaFX & SWT 5
T JTable - mehrere Tabellen verknüpfen AWT, Swing, JavaFX & SWT 14
T SWT Tabellen Kopf Schrift bearbeiten AWT, Swing, JavaFX & SWT 2
J Swing Spaltenbeschriftung bei Tabellen AWT, Swing, JavaFX & SWT 2
S Tabellen und Text Ausgabe in Swing GUI AWT, Swing, JavaFX & SWT 3
T Swing Sql Tabellen in jList ausgeben und speichern AWT, Swing, JavaFX & SWT 4
T Wie Zeilen in Tabellen farblich differenzieren? AWT, Swing, JavaFX & SWT 3
P Tabellen in Java - Zeile anhängen AWT, Swing, JavaFX & SWT 19
T Tabellen Inhalt in einem "anderem Frame" aktuallie AWT, Swing, JavaFX & SWT 7
0 JTable - Hintergrund Tabellen statt Grau AWT, Swing, JavaFX & SWT 5
D Voneinander abhängige Tabellen AWT, Swing, JavaFX & SWT 2
D Tabellen-Header anklickbar / auswählbar? AWT, Swing, JavaFX & SWT 5
L Tabellen formatieren ? AWT, Swing, JavaFX & SWT 4
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
G ein ContentProvider für 2 fast gleiche tabellen AWT, Swing, JavaFX & SWT 7
G Tabellen Items Einträge Aktualisieren AWT, Swing, JavaFX & SWT 2
K Spaltenbreite von mehreren Tabellen gleichzeitig verändern AWT, Swing, JavaFX & SWT 3
T listener für tabellen bei selektierung AWT, Swing, JavaFX & SWT 7
D mit swt.virtual mehrspaltige tabellen füllen AWT, Swing, JavaFX & SWT 3
I Probleme mit Tabellen (SWT) AWT, Swing, JavaFX & SWT 8
E SWT: Tabellen-Inhalt kopieren AWT, Swing, JavaFX & SWT 2
J Resultsets in Tabellen abbilden AWT, Swing, JavaFX & SWT 4
M Tabellen verschachteln AWT, Swing, JavaFX & SWT 7
G Tabellen Einträge löschen - JTable AWT, Swing, JavaFX & SWT 6
K Layout-Frage: 3 Feste Tabellen, 6-10dynamische AWT, Swing, JavaFX & SWT 2
R Mehrzeilige Darstellung von Spalten in SWING-Tabellen AWT, Swing, JavaFX & SWT 5
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
G JavaFX TableView Wert in Spalte ändern AWT, Swing, JavaFX & SWT 0
N Warum ist die Spalte weg? AWT, Swing, JavaFX & SWT 61
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
G JTable als fixierte Spalte in Scrollpane scrollt nicht mit... AWT, Swing, JavaFX & SWT 1
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
S Swing JTable zusätzliche Spalte mit einer Checkbox einfügen AWT, Swing, JavaFX & SWT 7
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
L Swing Button in GridBackLayout positionieren und TitleBorder pro Spalte hinzufügen AWT, Swing, JavaFX & SWT 9
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
S JTable Spalte "normale" Breite? AWT, Swing, JavaFX & SWT 5
X Icons in einer Spalte darstellen AWT, Swing, JavaFX & SWT 6
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
B Swing DefaultTableModel, Checkbox in Spalte AWT, Swing, JavaFX & SWT 4
L Action listener in bestimmter spalte AWT, Swing, JavaFX & SWT 2
N Swing JTable: Objekttyp einer Spalte nachträglich ändern AWT, Swing, JavaFX & SWT 6
R JTree - Spalte aufklappen AWT, Swing, JavaFX & SWT 2
A Swing Spalte in JTable ausblenden AWT, Swing, JavaFX & SWT 4
M JList von Beginn an sortiert nach Spalte ohne Klick? AWT, Swing, JavaFX & SWT 2
T JTable mit Renderer sortiert die gerenderte Spalte nicht richtig AWT, Swing, JavaFX & SWT 2
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
E Spalte in JTable löschen AWT, Swing, JavaFX & SWT 4
B JTable, Spalte nicht verschiebbar AWT, Swing, JavaFX & SWT 2
R JTable immer nur die letzte Spalte markiert.... AWT, Swing, JavaFX & SWT 4
S Swing JTable: in erster Spalte Image darstellen AWT, Swing, JavaFX & SWT 30
slawaweis JXTreeTable, jede Spalte einzeln scrollbar machen? AWT, Swing, JavaFX & SWT 2
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
V JTable: Sortierung einer Spalte zum Programmstart? AWT, Swing, JavaFX & SWT 3
G JTable warten bis Spalte verschoben wurde AWT, Swing, JavaFX & SWT 2
R JTable: Zellen einer Spalte unterschiedlich befüllen AWT, Swing, JavaFX & SWT 2
G JTable in Spalte von anderer JTable nicht editierbar AWT, Swing, JavaFX & SWT 7
G Alle Werte einer Spalte in JTable zusammenrechnen AWT, Swing, JavaFX & SWT 2
N Gridlayout 2. Spalte füllen AWT, Swing, JavaFX & SWT 4
I SWT Größe einer Tabellenzeile, -spalte ändern AWT, Swing, JavaFX & SWT 8
J in JTable ganze Spalte editierbar machen AWT, Swing, JavaFX & SWT 17
J JTable ganze Spalte sperren AWT, Swing, JavaFX & SWT 6
C Spalte aus JTable löschen AWT, Swing, JavaFX & SWT 8
mabe83 Kontinuierlich verbleibende Zeit in JTable Spalte anzeigen AWT, Swing, JavaFX & SWT 2
mabe83 Swing: jTableCellRenderer -> Klappt nur bei String-Spalte AWT, Swing, JavaFX & SWT 2
P JTable:Sortierung nach der Zeit/Spalte mit Calendar-Objekten AWT, Swing, JavaFX & SWT 2
D JTable 1. Spalte fixieren AWT, Swing, JavaFX & SWT 3
E JTable nur die erste Spalte auswählbar? AWT, Swing, JavaFX & SWT 4
A Icon,zentriert,Farbiger Text alles in einer Tabelle/Spalte ? AWT, Swing, JavaFX & SWT 4
B JTable - Wechsel der Spalte bei TAB, RETURN oder Maus AWT, Swing, JavaFX & SWT 5
S Hintergrundfarbe in einer Spalte der JTable verändern AWT, Swing, JavaFX & SWT 3
A JTable: Zeit in Spalte ausgeben AWT, Swing, JavaFX & SWT 2
F JTable Spalte sortieren mit lauter JComboboxen ? AWT, Swing, JavaFX & SWT 15
W Spalte einer Tabelle as nicht editierbar setzen - wie ? AWT, Swing, JavaFX & SWT 2
S Checkbox oder String in JTable-Spalte AWT, Swing, JavaFX & SWT 4
U JTable Position der Spalte abfragen AWT, Swing, JavaFX & SWT 7
W Wie setz ich beim TableRowSorter die zu sortierende Spalte AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben