Swing JComboBox in JTable

ocean.driver

Mitglied
Hallo,

Ich habe ein Tabellenmodell was in bestimmten Spalten eine ArrayList zurück gibt. Jetzt wollte ich mir dafür einen ListCellRenderer anlegen.

Java:
this.jt_MediaFileTable.setDefaultRenderer(ArrayList.class,new ListCellRenderer());


und hab dazu den ListCellRenderer implementiert:

Java:
package tableComponents;

import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

import java.util.ArrayList;

public class ListCellRenderer implements TableCellRenderer {

JComboBox combobox = new JComboBox();
	
	public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, 
			final boolean hasFocus, final int row, final int column) 
	{
		
		if (value instanceof ArrayList)
			for(Object o: (ArrayList)value)
				combobox.addItem(o);

		return combobox;
	}

	
}

Wo ist mein Denkfehler?was muss ich ändern?Danke schon einmal.
 
Hi André Uhres,

Aber das bezieht sich doch nur auf eine spezielle Spalte?Ich hatte vor für alle Spalten die eine ArrayList zurück geben diese so anzuzeigen. Editieren ist auch an dieser Stelle nicht notwendig.

Gibt es diese Möglichkeit auch über "setDefaultRenderer"?

gruß
 
Ich habe in einer Spalte statt eines einzelnen Wertes eine Liste von Werten (in einer ArrayList) die ich aufzeigen will.

Ich bekomm beispielsweise sowas von der Tabelle:

col_01 --> Integer
col_02 --> String
col_03 --> Date
col_04 --> ArrayList (soll per combobox dargestellt werden)
 
In einer Spalte ist gewöhnlich eine Liste von Werten, oder meinst du in einer Zelle?

Eine Liste kann man auch nicht durch eine Combobox in einer JTable darstellen. Eine Combobox ist einfach nur ein Label mit einem einzigen Wert, den man verändern kann, indem man aus einer Popupliste einen neuen Wert auswählt. Vom Standpunkt der JTable aus gesehen ist die Combobox also einfach nur ein Editor.

Gruß,
André
 
Zuletzt bearbeitet:
Achso, dann hatte ich das etwas falsch verstanden.

Also:

Ich habe eine Liste von Filmen. Jetzt habe ich eine Spalte in der ich die verfügbaren Sprachen angeben will. Jetzt kann es zum Beispiel sein, dass ein Film die Sprachen: deutsch, englisch und Somali hat. Wie kann ich diese Liste am besten darstellen ohne einfach eine komma-seperierte Liste zu haben?
 
Gibt es ne Bibliothek dafür?

Ich glaube ich würde lieber bei einer textuellen Ausgabe bleiben. Was gibt es da für Möglichkeiten?
Ist denn die Combox garnicht möglich? Die dürfe ja dann quasi nicht editable sein.
 
Zuletzt bearbeitet:
Versuch's mal so:
Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableTest extends JFrame {
    private JTable table;
    public TableTest() {
        initComponents();
        TableColumn column = table.getColumn("Sprachen");
        column.setCellRenderer(new MyRenderer());
    }
    private void initComponents() {
        table = new JTable();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        table.setModel(new DefaultTableModel(
                new Object[][]{
                    {null, "uk,de,so"},
                    {null, "uk,de"}
                },
                new String[]{
                    "Title 1", "Sprachen"
                }) {
            Class[] types = new Class[]{
                String.class, String.class
            };
            @Override
            public Class getColumnClass(int columnIndex) {
                return types[columnIndex];
            }
        });
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        pack();
    }
    public static void main(final String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TableTest().setVisible(true);
            }
        });
    }
}
class MyRenderer extends DefaultTableCellRenderer {
    private Object value;
    private JTable table;
    private int row;
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        this.value = value;
        this.table = table;
        this.row = row;
        c.setText("");
        return c;
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (value != null) {
            String[] split = value.toString().split(",");
            int x1 = 0;
            int rowHeight = table.getRowHeight(row);
            for (String string : split) {
                g.drawString(string, x1 + 3, rowHeight - 3);
                x1 += 20;
                g.drawLine(x1, 0, x1, rowHeight);
            }
        }
    }
}
 
Ist denn die Combox garnicht möglich? Die dürfe ja dann quasi nicht editable sein.
Naja, dafür gibt es ja die Methode JComboBox.setEditable(false). 🙂
Was für Probleme macht dein TableCellRenderer denn? Schaut mir eigentlich richtig aus. Abgesehen davon, das du vor dem hinzufügen der Sprachen des aktuellen Films vielleicht noch die Sprachen des vorhergehen Filmes aus der Combox löschen möchtest.
 
Danke erstmal!

Kannst du mir auch genau erklären, was dort passiert?Ich möchte ungern einfach kopieren.


Naja, dafür gibt es ja die Methode JComboBox.setEditable(false). 🙂
Was für Probleme macht dein TableCellRenderer denn? Schaut mir eigentlich richtig aus. Abgesehen davon, das du vor dem hinzufügen der Sprachen des aktuellen Films vielleicht noch die Sprachen des vorhergehen Filmes aus der Combox löschen möchtest.


Es passiert einfach nix wenn ich auf die Combobox klicke. Muss ich dazu vieleicht noch nen onClick-Event bauen?
 
Zuletzt bearbeitet:
Eine Combobox ist ja, im Sinne des Erfinders, nur dafür gedacht, einen einzigen Wert aus einer Liste von möglichen Werten auszuwählen. Das ist offenbar bei dir nicht das Ziel. Somit wäre die Verwendung einer Combobox in deinem Fall eine Zweckentfremdung und für den uneingeweihten Benutzer irritierend.

Wenn du unbedingt einen Popup haben willst, dann würde ich eher einen Tooltip vorschlagen.

Hier noch ein paar Erläuterungen zu meinem obigen Quellcode:
in der Klasse "MyRenderer" wird eine Referenz auf den Zellenwert (z.B. den Wert "uk,de,so") mit Hilfe der Methode "getTableCellRendererComponent" als Instanzvariable gespeichert (in der Variable "this.value"). Auf diese Weise können wir in "paintComponent" den Wert bequem so darstellen, wie wir es wünschen.

In der Methode "getTableCellRendererComponent" wird außerdem der Standardlabeltext mit [c]c.setText("");[/c] gelöscht, weil wir diesen Text ja selbst zeichnen wollen. Zusätzlich werden noch die Referenzen "table" und "row" gesichert, weil wir sie zur Bestimmung der Zeilenhöhe benötigen.

Die Methode "paintComponent" ist wohl selbsterklärend.

Gruß,
André
 

Neue Themen


Zurück
Oben