JList in JTable einfügen

Ned Nederlander

Aktives Mitglied
Hallo,
ich habe bislang einen CellEditor und einen CellRenderer:

Java:
class JListCellRenderer implements TableCellRenderer {
    public Component getTableCellRendererComponent(final JTable table,
            final Object value, final boolean isSelected,
            final boolean hasFocus, final int row, final int column) {
        return (JList) value;
    }
}
class JListCellEditor extends AbstractCellEditor implements TableCellEditor {
    private JList lst;
    public Object getCellEditorValue() {
        return lst;
    }
    public Component getTableCellEditorComponent(final JTable table,
            final Object value, final boolean isSelected,
            final int row, final int column) {
        lst = (JList) value;
        return lst;
    }
}

Sind diese zugewiesen, scheinen sie auch angenommen zu werden, sind allerdings leer.
Java:
table.getColumnModel().getColumn(2).setCellRenderer(new JListCellRenderer());
table.getColumnModel().getColumn(2).setCellEditor(new JListCellEditor());


Ich habe allerdings große Probleme, die Listen zu füllen. Irgendwie muss ja nun jeder Liste ein Vektor zugewiesen werden. Leider bekomm ich das nicht so ganz hin. ;(

Vielen Dank für eure Hilfe!
 
S

SlaterB

Gast
übe doch zunächst in der nomalen GUI eine JList darzustellen und dieser vorher Daten zuzuweisen,
oder meinst du dynamisch je nach Zeile/Spalte den Inhalt der JList zu ändern?

deswegen gibts ja getTableCellEditorComponent() die die JList zurückgibt, vorher kannst du beliebig neue Daten zuweisen,
aktuelle Index row/column sind als Parameter bekannt + die JTable und damit ihr Model
 

Michael...

Top Contributor
Ich würde ausserdem nicht unbedingt JList- Instanzen ins TableModel stecken, damit hebelst Du das Renderer/Editorkonzept der JTable aus.
 

Ned Nederlander

Aktives Mitglied
ich soll vorab ne JList füllen, und die dann mit setValueAt dem entsprechenden feld hinzufügen?


@ Michael..., was du meinst ist mir leider nicht klar. ich möchte in jede zelle ne andere liste schreiben.
 
S

SlaterB

Gast
> ich soll vorab ne JList füllen, und die dann mit setValueAt dem entsprechenden feld hinzufügen?

ist das eine Frage oder eine Feststellung, beziehst du dich auf mein Posting?
ich sagte, dass du zunächst eine JList für sich testen solltest, ganz ohne JTable

----

ins Model gehören nur die Daten, die möglichen Elemente zur Auswahl + die aktuelle Selektion,
der Renderer befüllt eine JList mit diesen Daten und zeichnet diese für einen kurzen Augenblick,
für das nächste Feld wird dieselbe JList mit anderen Daten schon wieder gemalt usw.
 

Ned Nederlander

Aktives Mitglied
Ich dachte ich muss CellRenderer und CellEditor schreiben, um die Listen überhaupt erst in die Zellen zu setzen. Lieg ich da falsch?

Meinst du damit, es reicht eine Liste mit setValueAt in die Zellen der Tabelle zu schreiben?
 
S

SlaterB

Gast
> Lieg ich da falsch?

nein

> Meinst du damit, es reicht eine Liste mit setValueAt in die Zellen der Tabelle zu schreiben?

nein, genau das ist falsch, dein Code deutet das an, Object value ist der Wert aus den Zellen, den du auf JList castest,
das meinte Michael...

richtig ist
> private JList lst;
im Editor, im Renderer brauchst du das auch, wobei ich mich frage wie das aussehen soll,
möchstest du nicht lieber nur einen Wert anzeigen, dann im Renderer gar nix tun,
und im Editor als Auswahl eine JComboBox statt JList? das ist viel bekannter, da gibts sicher massig Beispiele
 

Ned Nederlander

Aktives Mitglied
ich möchte einfach in einer spalte die möglichkeit haben, in einer zelle mehrere strings untereinander darzustellen. die liste erschien mir dafür die beste lösung, da ich bei einer TextArea probleme hatte, die zeilenhöhe entsprechend anzupassen.
bei ner combobox wird der inhalt ja leider erst angezeigt, wenn ich draufklicke.

wenn ihr andere möglichkeiten kennt, mehrere strings untereinander anzuzeigen, bin ich sehr dankbar.
 
S

SlaterB

Gast
tja, wenn es JList sein muss, dann mach mal, besteht aktuell eine Frage?

Internet-Suche brachte noch folgende Seite
Problem in having JList in JTable's cell

viel unterschiedlicher Code, aber irgendwo steht
> class ListCellRenderer extends JList implements TableCellRenderer
der Renderer selber ist eine JList,
Code unter anderem
Java:
  public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus,
        int nRow, int nCol)
    {

        if (value instanceof int[])
            setSelectedIndices((int[])value);
da sieht man wie das value-Objekt aus dem Table-Model lediglich ein int[] mit den selektierten Spalten ist,
das ist weniger als eine ganze JList, aber auch schon schwierig, dafür braucht man ein eigenes komplexes TableModel,
nicht nur eine simples 2D-Feld von Strings, wie normalerweise für eine Table
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
die liste erschien mir dafür die beste lösung, da ich bei einer TextArea probleme hatte, die zeilenhöhe entsprechend anzupassen.
Diese "Probleme" wirst Du bei einer JList ebenfalls haben - und wahrscheinlich noch mehr.
Willst Du einfach nur Text mehrzeilig in einer Tabellenzelle darstellen, dann nimm eine JTextArea als Renderer.
Beispiele und Lösungsansätze für das Problem mit der Zeilenhöhe solltest Du hier im Forum finden.
 

Ned Nederlander

Aktives Mitglied
ein problem wird da sein, dass ich die möglichkeit brauche, noch von hand weitere zeilen in einer zelle einzutragen. da muss sich die zeilenhöhe dann ja schliesslich auch ändern.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Wenn man eine JTextArea als Renderer und Editor nimmt, würde ich es in etwa wie folgt machen. Die TextArea des Editors habe ich in eine JScrollPane gesteckt, so dass man bei der Eingabe neuer Zeilen navigieren kann. Die neue Zeilenhöhe der Tabelle wird erst nach dem Editieren gesetzt.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
 
public class TextAreaRendererDemo extends JFrame {
    private JTable table;
 
    public TextAreaRendererDemo() {
    	DefaultTableModel model = new DefaultTableModel(null, new String[] {"Spalte 0", "Spalte 1"});
        table = new JTable(model) {
            public boolean editCellAt(int row, int column) {
                boolean b = super.editCellAt(row, column);
                if (column==1)
                    ((TextAreaEditor)table.getCellEditor(row, 1)).specialActivate();
                return b;
            }
        };
 
        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
 
        table.getColumnModel().getColumn(1).setCellRenderer(new TextAreaRenderer());
        table.getColumnModel().getColumn(1).setCellEditor(new TextAreaEditor());
        
        table.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent evt) {
                for (int row = 0; row < table.getRowCount(); row++) {
                	table.setRowHeight(row, table.prepareRenderer(table.getCellRenderer(row, 1), row, 1).getPreferredSize().height);
                }
            }
        });
        
        model.addRow(new String[] {"test", "Zeile   1 von 4 \nZeile   2 von 4 \nZeile   3 von 4 \nZeile   4 von 4"});
        model.addRow(new String[] {"test", "Zeile   1 von 2 \nZeile   2 von 2"});
        model.addRow(new String[] {"test", "Zeile   1 von 1"});
    }
 
    class TextAreaEditor extends AbstractCellEditor implements TableCellEditor {
 
        private JTextArea area;
        private JScrollPane pane;
 
        public TextAreaEditor() {
            area = new JTextArea();
            area.setLineWrap(true);
            area.setWrapStyleWord(true);
            area.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            pane = new JScrollPane(area);
        }
 
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value != null)
                area.setText(value.toString());
            else
                area.setText("");
            return pane;
        }
 
        public Object getCellEditorValue() {
            return area.getText();
        }
        
        public void specialActivate() {
            area.requestFocusInWindow();
        }
    }
 
    class TextAreaRenderer extends DefaultTableCellRenderer {
        private JTextArea area;
 
        public TextAreaRenderer() {
            area = new JTextArea();
            area.setLineWrap(true);
            area.setWrapStyleWord(true);
        }
 
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            area.setText(value.toString());
            area.setForeground(c.getForeground());
            area.setBackground(c.getBackground());
            if (hasFocus)
                area.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
            else
                area.setBorder(null);
            return area;
        }
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final JFrame frame = new TextAreaRendererDemo();
                frame.setBounds(0, 0, 500, 300);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}
 

Michael...

Top Contributor
Da die TextArea des Editors in einer JScrollPane eingebeten ist, habe ich dem Editor die Methode specialActivate() verpasst, damit beim Aktivieren des Editors über die Tastatur die Area sofort den Fokus bekommt.

Kannst ja mal den Unterschied ausprobieren: Navigiere mit den Cursortasten auf eine Zelle der zweiten Spalte und drücke einen Buchstaben. Die TextArea bekommt den Fokus und der Textcursor blinkt am Ende des Texts.
Kommentiere die Zeilen aus und probiere das selbe noch einmal.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
L SQL & Jtable o. JList AWT, Swing, JavaFX & SWT 5
M Java Applet JTable/JList AWT, Swing, JavaFX & SWT 6
X Swing Models (JTable, JList etc.) statisch deklarieren ? AWT, Swing, JavaFX & SWT 18
Dit_ JList oder JTable? AWT, Swing, JavaFX & SWT 15
J JList-Item ind JTable-Zelle auswählen. AWT, Swing, JavaFX & SWT 5
P Mischung aus JTable und JList AWT, Swing, JavaFX & SWT 7
G JList, einzelne Strings hinzufügen AWT, Swing, JavaFX & SWT 9
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
B Swing Dynamische JList mit Bildern AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
M JList Model filtern AWT, Swing, JavaFX & SWT 4
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
K Mehrfachselektierungen in einer JList AWT, Swing, JavaFX & SWT 6
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
E selektierter Datensatz in JList als String Datentyp AWT, Swing, JavaFX & SWT 23
E selektiertes Element aus JList zurückgeben AWT, Swing, JavaFX & SWT 7
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
B JList -> Disabled AWT, Swing, JavaFX & SWT 6
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
I Jlist isselectionEmpty AWT, Swing, JavaFX & SWT 4
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
E Jlist nur mit Klasse? AWT, Swing, JavaFX & SWT 5
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D JList items voneinander trennen AWT, Swing, JavaFX & SWT 10
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben