1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

JTable mit unterschiedlichen Typen in derselben Spalte?

  • owaye
  • 3. November 2008 um 12:59
  • Unerledigt
  • owaye
    6
    owaye
    Mitglied
    Reaktionen
    3
    Punkte
    313
    Beiträge
    46
    • 3. November 2008 um 12:59
    • #1

    Hi! Hab ne Frage bezüglich JTables...
    Hab da einen JTable, der besteht aus 2 Spalten und nun möchte ich dass in der Spalte2 verschiedene Datentypen drinstehen können. Beispiel:

    Spalte1 | Spalte2
    -----------------
    Name: | Objektname // String
    Pos X: | 50 // int
    Pos Y: | 10 // int
    Enable: | [x] // in dieser Zeile eine Checkbox im Sinne von True/False
    Color: | *Button* // hier ein JButton der einen COlorchooser öffnet

    Meine bisherige Lösung sieht so aus, dass ich statt einem JTable ein paar JTextFields nehme und dort alles als String auslese bzw. parse. Den Button für den ColorChooser hab ich extra, ebenso wie die Checkbox;

    Jedoch denk ich mal dass ein JTable schöner aussehen würde :zwinker:
    Auf den Java Tutorials über JTables hab ich lediglich gefunden, wie man einen DatenTyp für die gesamte Spalte bestimmt, nicht jedoch wenn mehrere Datentypen in dieser Spalte vorhanden sein sollen. Geht das überhaupt?

    hab da so ein JTable mal zusammengeschustert :shinner:, doch offenbar weiss der Table nicht wie er den Button und die CheckBox behandeln soll und liefert lediglich einen String... Hat jemand ne Ahnung wie man das hinbiegen könnte?

    Java
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Font;
    
    
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    
    public class DefaultCellEditorJTextFieldAlignment extends JFrame
    {	
    	DefaultTableModel model = new DefaultTableModel(new Object[][] {
    			{ "X", "0" },
    			{ "Y", "0" },
    			{ "Color", add(new JButton("huhu")) },
    			{"Enabled", add(new JCheckBox("bla",true))}	},
    			new Object[] { "Property", "Value" })
    
    	{
    		public boolean isCellEditable(int row, int col) 
    		{
    			// nur 2. column darf verändert werden
    			return col == 1; 	
    		}
    	};
    
    
    	public DefaultCellEditorJTextFieldAlignment() 
    	{
    	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    JTable table = new JTable(model);
    	    table.setDefaultEditor(Object.class, new MyEditor());
    	    table.setRowHeight(18);
    	    table.setFont(new Font("Arial",Font.PLAIN,14));
    
    	    TableColumn column = null;
    	    for (int i = 0; i < 2; i++) {
    	        column = table.getColumnModel().getColumn(i);
    	        if (i == 0) {
    	            column.setPreferredWidth(50);
    	        } else {
    	            column.setPreferredWidth(150);
    	        }
    	    }
    
    	    getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
    	    pack();
    	}
    
    	public static void main(String arg[]) 
    	{
    	    new DefaultCellEditorJTextFieldAlignment().setVisible(true);
    	}
    }
    
    class MyEditor extends DefaultCellEditor 
    {
    	public MyEditor() 
    	{
    		super(new JTextField());
    
    	    setClickCountToStart(1);
    	}
    
    	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,int row, int column) 
    	{
    	    JTextField editor = (JTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
    	    editor.setBorder(null);
    	    editor.setFont(new Font("Arial",Font.PLAIN,14));
    
    	    return editor;
    	}
    	public JButton getTableCellEditorComponent2(JTable table, Object value, boolean isSelected,int row, int column) 
    	{
    	    JButton button = (JButton) super.getTableCellEditorComponent(table, value, isSelected, row, column);
    	    button.setFont(new Font("Arial",Font.PLAIN,14));
    
    	    return button;
    	}
    	public JCheckBox getTableCellEditorComponent3(JTable table, Object value, boolean isSelected,int row, int column) 
    	{
    	    JCheckBox cb = (JCheckBox) super.getTableCellEditorComponent(table, value, isSelected, row, column);
    	    cb.setFont(new Font("Arial",Font.PLAIN,14));
    
    	    return cb;
    	}
    }
    Alles anzeigen
  • seHaas
    11
    seHaas
    Mitglied
    Reaktionen
    3
    Punkte
    1.238
    Beiträge
    206
    • 3. November 2008 um 14:02
    • #2

    hi,

    schau dir die Funktionen getCellRenderer und getCellEditor von der JTable an.
    da bekommst du die Spalte und Ziele mit übergeben - anhand derer musst halt entscheiden welchen Renderer/Editor du anzeigst.

    Du kannst ja in deinem Tablemodel eine Funktion getCellClass definieren, die du in den oben genannten Funktionen verwendest.

    mfg seHaas

  • java-girl
    14
    java-girl
    Mitglied
    Reaktionen
    7
    Punkte
    2.037
    Beiträge
    357
    • 4. November 2008 um 16:31
    • #3

    Bei Verwendung eines TableModels musst du eine Methode implementieren, die für die jeweilige Zelle den Typ zurückgibt. Gibst du dort den Typ boolean zurück, entsteht automatisch eine CheckBox, ohne dass du selbst einen Renderer schreiben musst.

    There's no better place than 127.0.0.1!

  • seHaas
    11
    seHaas
    Mitglied
    Reaktionen
    3
    Punkte
    1.238
    Beiträge
    206
    • 4. November 2008 um 19:03
    • #4
    Zitat von java-girl

    Bei Verwendung eines TableModels musst du eine Methode implementieren, die für die jeweilige Zelle den Typ zurückgibt.


    Welche Methode meinst du? getColumnClass geht nur auf Spaltenebene.

    Zitat von java-girl

    Gibst du dort den Typ boolean zurück, entsteht automatisch eine CheckBox, ohne dass du selbst einen Renderer schreiben musst.


    Den Renderer musst in der Regel eh nicht selber schreiben, nur du musst halt die Zuordnung selber machen.

    mfg seHaas

  • java-girl
    14
    java-girl
    Mitglied
    Reaktionen
    7
    Punkte
    2.037
    Beiträge
    357
    • 4. November 2008 um 19:14
    • #5
    Zitat von seHaas

    Welche Methode meinst du? getColumnClass geht nur auf Spaltenebene.

    Ja, stimmt, das geht doch nicht, da hatte ich wohl etwas falsch in Erinnerung, sorry für die Verwirrung.

    Zitat von seHaas


    Den Renderer musst in der Regel eh nicht selber schreiben, nur du musst halt die Zuordnung selber machen.

    Sicher muss man ihn selbst schreiben, aber das tut jetzt nichts zur Sache.

    mfg.

    There's no better place than 127.0.0.1!

  • owaye
    6
    owaye
    Mitglied
    Reaktionen
    3
    Punkte
    313
    Beiträge
    46
    • 5. November 2008 um 09:55
    • #6

    hey, Danke für die Tipps. Jo, dass die Einstellungen nur pro Spalte funktionieren ist etwas ärgerlich, hab mir da auch den Kopf gestoßen.

    Ich wollte eigentlich schon einen alternativen Lösungsweg nehmen aber hab jetzt nochmal gegoogelt und das gefunden; sieht recht vielversprechend aus :): http://www.benwol.de/index.php?/arc…ble-Column.html

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung