Schon wieder JTable

Colt45

Aktives Mitglied
Moin, ich hab mal wieder ein kleines Problem mit der JTable.
Folgendes: Ich hab ne JTable mit 4 Spalten, die erste Spalte repräsentiert einen boolean, die anderen Strings. Die Daten kommen aus einer Datenbank und sind in einem Vector gespeichert.
Nun hakts bei mir wieder am TableModel, ich will nämlich dass alle Zellen nicht editierbar sind, ausser natürlich die erste Spalte, in der man in der Checkbox ein Häkchen setzen kann. Bitte verweist mich nicht auf den großen JTable-Thread hier, daraus bin ich nicht schlau geworden.
 

Colt45

Aktives Mitglied
Irgendwie funktioniert das nicht ganz:

Java:
package unit;

import java.util.Vector;

import javax.swing.table.AbstractTableModel;

public class UnitStaffTableModel extends AbstractTableModel
{
	private Vector<String> headers;
	private Vector<Vector> data;
	private Class[] columnClasses = {Boolean.class, String.class, String.class, String.class};
	
	public UnitStaffTableModel(Vector<Vector> data, Vector<String> headers)
	{
		super();
		this.data = data;
		this.headers = headers;
	}
	@Override
	public int getColumnCount() 
	{
		return 4;
	}

	@Override
	public int getRowCount() 
	{
		return data.size();
	}

	public String getColumnName(int col)
	{
		return headers.elementAt(col);
	}
	
    @SuppressWarnings("unchecked")
    public Class getColumnClass(int c)
    {
        return columnClasses[c];
    }
    
	public boolean isCellEditable(int row, int col)
	{
		return col == 0;
	}
	
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) 
	{
		return data.elementAt(rowIndex).elementAt(columnIndex);
	}

}
wenn ich in der isCellEditable() col auf 1 oder eine andere Spalte setze, dann ist diese editierbar, aber bei col == 0 lässt sich das Häckchen in der Checkbox nicht setzen.
 

L-ectron-X

Gesperrter Benutzer
Sowas?

Java:
/* From [url=http://java.sun.com/docs/books/tutorial/index.html]The Java™ Tutorials[/url] */

/*
 * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution in binary form must reproduce the above copyright notice,
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */

/*
 * TableRenderDemo.java is a 1.4 application that requires no other files.
 */

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

/**
 * TableRenderDemo is just like TableDemo, except that it explicitly initializes
 * column sizes and it uses a combo box as an editor for the Sport column.
 */
public class TableRenderDemo extends JPanel {
  private boolean DEBUG = false;

  public TableRenderDemo() {
    super(new GridLayout(1, 0));

    JTable table = new JTable(new MyTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));

    //Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);

    //Set up column sizes.
    initColumnSizes(table);

    //Fiddle with the Sport column's cell editors/renderers.
    setUpSportColumn(table, table.getColumnModel().getColumn(2));

    //Add the scroll pane to this panel.
    add(scrollPane);
  }

  /*
   * This method picks good column sizes. If all column heads are wider than
   * the column's cells' contents, then you can just use
   * column.sizeWidthToFit().
   */
  private void initColumnSizes(JTable table) {
    MyTableModel model = (MyTableModel) table.getModel();
    TableColumn column = null;
    Component comp = null;
    int headerWidth = 0;
    int cellWidth = 0;
    Object[] longValues = model.longValues;
    TableCellRenderer headerRenderer = table.getTableHeader()
        .getDefaultRenderer();

    for (int i = 0; i < 5; i++) {
      column = table.getColumnModel().getColumn(i);

      comp = headerRenderer.getTableCellRendererComponent(null, column
          .getHeaderValue(), false, false, 0, 0);
      headerWidth = comp.getPreferredSize().width;

      comp = table.getDefaultRenderer(model.getColumnClass(i))
          .getTableCellRendererComponent(table, longValues[i], false,
              false, 0, i);
      cellWidth = comp.getPreferredSize().width;

      if (DEBUG) {
        System.out.println("Initializing width of column " + i + ". "
            + "headerWidth = " + headerWidth + "; cellWidth = "
            + cellWidth);
      }

      //XXX: Before Swing 1.1 Beta 2, use setMinWidth instead.
      column.setPreferredWidth(Math.max(headerWidth, cellWidth));
    }
  }

  public void setUpSportColumn(JTable table, TableColumn sportColumn) {
    //Set up the editor for the sport cells.
    JComboBox comboBox = new JComboBox();
    comboBox.addItem("Snowboarding");
    comboBox.addItem("Rowing");
    comboBox.addItem("Knitting");
    comboBox.addItem("Speed reading");
    comboBox.addItem("Pool");
    comboBox.addItem("None of the above");
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

    //Set up tool tips for the sport cells.
    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    renderer.setToolTipText("Click for combo box");
    sportColumn.setCellRenderer(renderer);
  }

  class MyTableModel extends AbstractTableModel {
    private String[] columnNames = { "First Name", "Last Name", "Sport",
        "# of Years", "Vegetarian" };

    private Object[][] data = {
        { "Mary", "Campione", "Snowboarding", new Integer(5),
            new Boolean(false) },
        { "Alison", "Huml", "Rowing", new Integer(3), new Boolean(true) },
        { "Kathy", "Walrath", "Knitting", new Integer(2),
            new Boolean(false) },
        { "Sharon", "Zakhour", "Speed reading", new Integer(20),
            new Boolean(true) },
        { "Philip", "Milne", "Pool", new Integer(10),
            new Boolean(false) } };

    public final Object[] longValues = { "Sharon", "Campione",
        "None of the above", new Integer(20), Boolean.TRUE };

    public int getColumnCount() {
      return columnNames.length;
    }

    public int getRowCount() {
      return data.length;
    }

    public String getColumnName(int col) {
      return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
      return data[row][col];
    }

    /*
     * JTable uses this method to determine the default renderer/ editor for
     * each cell. If we didn't implement this method, then the last column
     * would contain text ("true"/"false"), rather than a check box.
     */
    public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's editable.
     */
    public boolean isCellEditable(int row, int col) {
      //Note that the data/cell address is constant,
      //no matter where the cell appears onscreen.
      if (col < 2) {
        return false;
      } else {
        return true;
      }
    }

    /*
     * Don't need to implement this method unless your table's data can
     * change.
     */
    public void setValueAt(Object value, int row, int col) {
      if (DEBUG) {
        System.out.println("Setting value at " + row + "," + col
            + " to " + value + " (an instance of "
            + value.getClass() + ")");
      }

      data[row][col] = value;
      fireTableCellUpdated(row, col);

      if (DEBUG) {
        System.out.println("New value of data:");
        printDebugData();
      }
    }

    private void printDebugData() {
      int numRows = getRowCount();
      int numCols = getColumnCount();

      for (int i = 0; i < numRows; i++) {
        System.out.print("    row " + i + ":");
        for (int j = 0; j < numCols; j++) {
          System.out.print("  " + data[i][j]);
        }
        System.out.println();
      }
      System.out.println("--------------------------");
    }
  }

  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    //Make sure we have nice window decorations.
    JFrame.setDefaultLookAndFeelDecorated(true);

    //Create and set up the window.
    JFrame frame = new JFrame("TableRenderDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    TableRenderDemo newContentPane = new TableRenderDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}
 

André Uhres

Top Contributor
Bitte verweist mich nicht auf den großen JTable-Thread hier, daraus bin ich nicht schlau geworden.

Du hast recht, in unserem JTable Tutorial könnte man etwas deutlicher erklären, was beim "Editieren" geschieht. Die Methode TableModel#setValueAt spielt dabei die entscheidende Rolle:
Java:
public void setValueAt(Object value, int row, int col) {
    data.elementAt(row).setElementAt(value, col); 
    fireTableCellUpdated(row, col);
}
Gruß,
André
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Kannst du auch erklären, was da genau beim "Editieren" geschieht?

Damit eine Zelle editiert werden kann, müssen die folgenden zwei Methoden im TableModel korrekt implementiert werden. Als Beispiel zeige ich die Implementationen aus dem "DefaultTableModel":

Java:
    public boolean isCellEditable(int row, int column) {
        return true;
    }
Java:
    public void setValueAt(Object aValue, int row, int column) {
        Vector rowVector = (Vector)dataVector.elementAt(row);
        rowVector.setElementAt(aValue, column);
        fireTableCellUpdated(row, column);
    }

Bei dem Versuch, eine Zelle zu editieren, ruft das System zunächst die Methode "TableModel#isCellEditable" auf. Gibt sie "false" zurück, ist ein Editieren dieser Zelle nicht möglich. Gibt sie "true" zurück, kann der Wert der Zelle verändert werden. Wenn das geschehen ist, muss der neue Wert aber noch im TableModel abgespeichert werden. Dazu ruft das System automatisch die Methode "TableModel#setValueAt" auf und übergibt ihr den neuen Wert der Zelle. Die Methode "setValueAt" ist dann dafür verantwortlich, diesen Wert im TableModel abzuspeichern.

Gruß,
André
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
S ProgressBar newRunnable (schon wieder!) AWT, Swing, JavaFX & SWT 9
P schon wieder schlange AWT, Swing, JavaFX & SWT 8
Z Und schon wieder die Linien (Problem beim überzeichnen) AWT, Swing, JavaFX & SWT 4
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
K Und schon wieder JInternalFrame AWT, Swing, JavaFX & SWT 2
dzim JetBrains Compose - hat das schon jemand probiert? AWT, Swing, JavaFX & SWT 3
B Swing Locale wechseln, nachdem UIManager schon initialisiert ist AWT, Swing, JavaFX & SWT 5
Binary.Coder Netbeans GUI zu Eclipse (schon gegooglet und einiges ausprobiert). AWT, Swing, JavaFX & SWT 4
N JComboBox schon zum Teil aufgeklappt AWT, Swing, JavaFX & SWT 7
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
GilbertGrape JTable mit Combobox-Editierung schon nach einem Klick AWT, Swing, JavaFX & SWT 7
oliver1974 Wer hat QT Jambi schon probiert? AWT, Swing, JavaFX & SWT 5
M Ist Swing schon fertig? AWT, Swing, JavaFX & SWT 3
F SkinLF - GTK Icons werden nicht genutz - KDE schon - why? AWT, Swing, JavaFX & SWT 8
D Prüfen, ob Fenster bereits schon geöffnet ist AWT, Swing, JavaFX & SWT 1
richis-fragen Wie kann man den RowSorter dazu bringen die ursprünglich liste wieder anzuzeigen. AWT, Swing, JavaFX & SWT 28
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
C SWT CTabItem wieder sichtbar machen AWT, Swing, JavaFX & SWT 3
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
L Buttons aus Arrayliste erstellt wie komm ich nun wieder an das Oobjekt aus der arrayliste ran AWT, Swing, JavaFX & SWT 3
Z Swing Buttons wieder entfernen vom Bildschirm AWT, Swing, JavaFX & SWT 5
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
Ollek Swing JPnales nach bestimmtenVorgang wieder anzeigen AWT, Swing, JavaFX & SWT 4
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
M AWT Zurücksetzbutton, wieder auf das original Bild AWT, Swing, JavaFX & SWT 3
M Fenster nach minimierung zum tray wieder öffnen AWT, Swing, JavaFX & SWT 3
E Swing Wieder ein Bild einfügen AWT, Swing, JavaFX & SWT 2
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
F JFileChooser mal wieder AWT, Swing, JavaFX & SWT 2
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
hdi Swing mal wieder EDT -> nichts passiert AWT, Swing, JavaFX & SWT 20
S Feintuning, mal wieder Threading + swing ... AWT, Swing, JavaFX & SWT 8
P JTable...mal wieder AWT, Swing, JavaFX & SWT 7
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
A Wie werde ich beim JTable die Selection wieder los? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
T Mal wieder Swing GUI AWT, Swing, JavaFX & SWT 7
hdi repaint() mag mal wieder nicht. AWT, Swing, JavaFX & SWT 9
T JCheckBox deselektieren (Haken wieder entfernen) - wie? AWT, Swing, JavaFX & SWT 5
M ich will die alten "alte JButtons"wieder haben AWT, Swing, JavaFX & SWT 6
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
G wieder mal das leidige thema listener AWT, Swing, JavaFX & SWT 3
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2
C JTable. Mal wieder AWT, Swing, JavaFX & SWT 10
T Ich komme mal wieder nicht mit Swing und Image klar. AWT, Swing, JavaFX & SWT 5
G SWT Toolbar: Toolitem entfernen und wieder hinzufügen AWT, Swing, JavaFX & SWT 16
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
T Linien zeichnen und wieder löschen AWT, Swing, JavaFX & SWT 9
V mal wieder das gute alte gridbaglayout AWT, Swing, JavaFX & SWT 4
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
S JScrollPane mal wieder AWT, Swing, JavaFX & SWT 2
R JLabel Icon wieder entfernen AWT, Swing, JavaFX & SWT 4
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
R Mal wieder JTable AWT, Swing, JavaFX & SWT 11
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G mal wieder table. AWT, Swing, JavaFX & SWT 3
X wieder mal ein prob mit dnd AWT, Swing, JavaFX & SWT 14
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
S JFrame minimieren und wieder herstellen AWT, Swing, JavaFX & SWT 2
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
R Anonymen CaretListener wieder entfernen AWT, Swing, JavaFX & SWT 4
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
S Wieder eine Frage zu javax.swing.text AWT, Swing, JavaFX & SWT 2
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben