JTable + CheckBox

Baste

Mitglied
Hi.
Als aller erstes muss ich sagen, bin noch Anfänger
Ich möchte eine JTable mit 10 Spalten erstellen, klappt ja soweit.
Nun will ich aber in der letzten Spalte ("freigeben") zu jeder Zeile eine CheckBox haben, komme aber hier nicht mehr weiter. Kann mir da evtl. jemand helfen, wäre echt super.
Bin noch in den Anfängen der Programmierung, bitte um Verständniss ;)

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class FrameTable extends JFrame
{
	
  //Spalten-Namen
  private String[] columnNamen = { "Name", "Tag", "Von", "Bis",
			  "Projekt", "Aufgabe", "Task-Nr.", "Beschreibung", 
			  "Stunden", "Summe", "freigeben" };
	  
	  //Tabelleninhalt - leere Zeilen
  private Object[][] Daten = { {},{},{},{},{}, {},{},{},{},{}, {},{},{},{},{}, {},{},{},{},{}, {},{},{},{},{} };
	
  private DefaultTableModel tableModelM;

  private JComponent jc = (JComponent) getContentPane();

  FrameTable()
  {
    super();
    setTitle("FrameTable");
    setSize(800, 600);
    initLayout();
    setLocationRelativeTo(null);
    setVisible(true);
    setResizable(false);
  }

  void initLayout()
  {
    jc.setLayout(new BorderLayout());

    // JTable erstellen
    tableModelM = new DefaultTableModel(Daten, columnNamen);

    JTable tableDaten = new JTable(tableModelM);
    tableDaten.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    // tableSpieler einem Container zuführen
    JScrollPane scrollM = new JScrollPane(tableDaten);
    scrollM.setPreferredSize(new Dimension(450, 300));

    // West
    JPanel wPnl = new JPanel();
    wPnl.add("Center", scrollM);
    jc.add("Center", wPnl);

  }
  //main-Methode
  public static void main(String[] args)
  {
    FrameTable frame = new FrameTable();
    frame.setLocation(300,300);
    frame.setSize(500, 350);
    frame.setResizable(true);
    frame.setVisible(true);
  }
}
 
Baste hat gesagt.:
Nun will ich aber in der letzten Spalte ("freigeben") zu jeder Zeile eine CheckBox haben, komme aber hier nicht mehr weiter.

Also im Grunde reicht es, in dem TableModel die Methode getColumnClass so zu implementieren, dass für diese Spalte Boolean.class zurückgegeben wird. Die Tabelle verfügt nämlich per default über einige Standardrenderer und -editoren. Für Boolean ist das eine CheckBox, für String ein JTextField.
 
@Luxor
Ja so ewtas in der Art such ich (1st Link). Ist sehr hilfreich. Thx

@Snape
Danke für den Tip, werd es gleich mal versuchen in die Tat umzusetzen.
 
Hi Leute.
Habe mir jetz mal ne Tabelle mit CheckBoxen zusammen gebaut.

Hier mein

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;
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.JTableHeader;
import javax.swing.table.TableModel;

public class JTableExample extends JPanel {
  private boolean DEBUG = false;
  
  public JTableExample() {
    super(new BorderLayout());

    JTable table = new JTable(new MyTableModel()) {

    };

    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setPreferredSize(new Dimension(700, 300));

    add(scrollPane);
  }

  class MyTableModel extends AbstractTableModel {
    private String[] columnNames = { "Name", "Tag", "Von",
        "Bis", "Projekt", "Aufgabe", "Task-Nr.", "Beschreibung",
        "Stunden", "Summe", "freigeben" };

    private Object[][] data = {
    		
    	{ "","","","","","", new Integer(0),"","","", new Boolean(false) },
    	{ "","","","","","", new Integer(0),"","","", new Boolean(false) },
    	{ "","","","","","", new Integer(0),"","","", new Boolean(false) },
    	{ "","","","","","", new Integer(0),"","","", new Boolean(false) },
    	{ "","","","","","", new Integer(0),"","","", new Boolean(false) },};
 
    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];
    }

    public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {

      if (col < 0) {
        return false;
      } else {
        return true;
      }
    }

    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("--------------------------");
    }
}
  private static void createAndShowGUI() {
    JFrame.setDefaultLookAndFeelDecorated(true);

    JFrame frame = new JFrame("TableDemo");
    frame.setLocation(200,300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JComponent newContentPane = new JTableExample();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}

Und jetzt meine Frage: Ist diese JTable zu umständlich oder ungünstig programmiert.
Wer Tips und Verbesserungsvorschläge hat, kann sie ja mal posten, würde mich sehr freuen.
Aller Anfang is schwer ;)
 
Sieht so weit ok aus. Allerdings ist das zur Datenhaltung oft benutzte zweidimensionale Array nicht gerade flexibel, wenn es ums Hinzufügen und Löschen von Datensätzen geht.
 
Der Zweck soll sein, dass ich Daten aus einer Datenbank in diese Tabelle importieren möchte. In dieser Tabelle dann unvollständige Datensätze bearbeiten (z.B. fehlende Aufgaben-Nr.) und anschließend die vollständigen Datensätze in eine andere Datenbank exportieren.
Habe mir eben erst mal nur Gedanken gemacht, wie die Tabelle aussehen soll.
Oder bin ich da auf einem ganz falschem Weg?
 

Neue Beiträge

Zurück