Wie bekomme ich die CellRow, wenn es ein ItemEvent in der JComboBox innerhalb der Zelle gibt

Lesezeit: 4 Minuten

Wie bekomme ich die CellRow wenn es ein ItemEvent in
JeffS

Ich habe eine JTable mit einer Spalte, die eine JComboBox enthält.

Ich habe einen ItemListener an die JComboBox angehängt, der auf alle Änderungen reagiert.

ItemListener verfügt jedoch nicht über eine Methode zum Abrufen der Zeile, in der sich die geänderte ComboBox befindet.

Ich muss die Zeilennummer eingeben, um auf eine andere Spalte in derselben Zeile einzuwirken, wenn die ComboBox eine Änderung aufweist.

Jede Hilfe wäre willkommen.


Dies ist mein kurzer und prägnanter Code. Was ich zu erreichen versuche, ist das Abrufen der Tabellenzeile der ComboBox, wenn der itemlistener eine Änderung aufnimmt.

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class Example extends JFrame {

    private static final long serialVersionUID = 1L;
    public static int maxX, maxY;
    public static final String[] columnHeads = {"Col 1", "Col 2", "Col 3"};

    public static void main(String args[]) throws IOException {
        Example example = new Example();
    }

    public Example() {
        //Create Table Model
        DefaultTableModel model = new DefaultTableModel();

        for (int index = 0; index < columnHeads.length; index++) {
            model.addColumn(columnHeads[index]);
        }

        //Create Table
        JTable table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);

        //List for ComboBox
        String[] list = {"Item1", "Item2", "Item3"};

        //Create ComboBox
        JComboBox itemTypes = attachComboBoxRenderer(table, 2, list);

        //Attach Item Listener
        itemTypes.addItemListener(new ComboBoxListener());
        ((DefaultTableModel) table.getModel()).insertRow(
            table.getRowCount(), new Object[]{"C1", "C2", ""});
        this.setTitle("Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container container = getContentPane();

        //MAIN Panel
        final JPanel main = new JPanel();
        main.setLayout(new GridBagLayout());
        main.add(scrollPane);

        container.add(main);
        this.pack();
        this.setVisible(true);
    }

    public static JComboBox attachComboBoxRenderer(
        JTable table, int column, Object[] values) {
        JComboBox combo = new JComboBox(values);
        TableColumn col = table.getColumnModel().getColumn(column);
        col.setCellRenderer(new ComboBoxRenderer(values));
        col.setCellEditor(new DefaultCellEditor(combo));
        return combo;
    }
}

class ComboBoxListener implements ItemListener {

    private static final int SELECTED = 1;

    @Override
    public void itemStateChanged(ItemEvent e) {
        // Get the affected item
        Object item = e.getItem();
        if (item.toString() != null
            && !"".equals(item.toString())
            && e.getStateChange() == SELECTED) {
            System.out.println(item.toString() + " selected");
            //How do I get Row in the Table of the ComboBox that was changed?
        }
    }
}

class ComboBoxRenderer extends JComboBox implements TableCellRenderer {

    private static final long serialVersionUID = 1L;

    public ComboBoxRenderer(Object[] items) {
        super(items);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            super.setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }
        // Select the current value
        setSelectedItem(value);
        return this;
    }
}

  • Was meinst du mit “Spalte mit einer JComboBox”? als Renderkomponente, als Bearbeitungskomponente, als Daten?

    – Kleopatra

    14. September 2011 um 15:40 Uhr

Wie bekomme ich die CellRow wenn es ein ItemEvent in
Müllgott

Es klingt so, als wären Sie es Verwenden eines Kombinationsfelds als Editor. Wenn ja, die TableCellEditor Methode, getTableCellEditorComponent()umfasst die row als Parameter. Es gibt ein ähnliches Beispiel Hier.

Nachtrag: Um einen Wert in derselben Zeile zu ändern, die Sie bearbeitet haben, lassen Sie das Modell einfach den richtigen Wert für die “andere Spalte” basierend auf den zugehörigen Werten in dieser Zeile zurückgeben. Aktualisieren Sie alternativ den zugehörigen Wert in Ihrem Modell setValueAt() -Methode vor dem Auslösen des Updates, wie in der gezeigt Beispiel.

Nachtrag: Basierend auf Ihrem Beispiel überschreibt der folgende Code den des Modells getValueAt() -Methode, um die abhängige Spalte mit der Elementspalte synchron zu halten.

Geben Sie hier die Bildbeschreibung ein

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

/** @see http://stackoverflow.com/questions/7350445 */
public class DependentColumn extends JFrame {

    private static final int DEPENDENT_COL = 1;
    private static final int ITEM_COL = 2;
    private static final String[] columnNames = {"Col 1", "Col 2", "Col 3"};

    public static void main(String args[]) throws IOException {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DependentColumn dc = new DependentColumn();
            }
        });
    }

    public DependentColumn() {
        this.setTitle("Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create Model & Table
        DefaultTableModel model = new DefaultTableModel(columnNames, 0) {

            @Override
            public Object getValueAt(int row, int col) {
                if (col == DEPENDENT_COL) {
                    return "C2:" + this.getValueAt(row, ITEM_COL);
                } else {
                    return super.getValueAt(row, col);
                }
            }
        };
        for (int i = 0; i < 16; i++) {
            model.addRow(new Object[]{"C1", "C2", "Item1"});
        }
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(320, 120));

        //Create ComboBox
        String[] items = {"Item1", "Item2", "Item3"};
        JComboBox combo = new JComboBox(items);
        TableColumn col = table.getColumnModel().getColumn(ITEM_COL);
        col.setCellEditor(new DefaultCellEditor(combo));
        combo.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    System.out.println(e.getItem() + " selected");
                }
            }
        });

        this.add(new JScrollPane(table));
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

  • Danke für die schnelle Antwort. Aber die Methode getTableCellEditor() erfordert, dass ich ihr einen Zeilenwert gebe, und sie gibt die CellEditor-Komponente zurück. Ich möchte anhand der ausgewählten Komponente herausfinden, was die Zeile ist.

    – JeffS

    9. September 2011 um 15:27 Uhr


  • Ich habe oben ausgeführt; aber ohne Ihre scceIch vermute.

    – Müllgott

    9. September 2011 um 19:07 Uhr

  • +1 für den Nachtrag – das ist der richtige Weg, @JeffS – hören Sie niemals direkt auf Redakteure, sie sollen genau einem Master (dem JTable fi) dienen und werden alle anderen täuschen 🙂

    – Kleopatra

    15. September 2011 um 9:47 Uhr

  • @ JeffS: Ich habe Ihre sscce geändert, um einen Ansatz zu veranschaulichen und Kleopatras aufschlussreiche Beobachtung anzuerkennen.

    – Müllgott

    15. September 2011 um 17:45 Uhr

923920cookie-checkWie bekomme ich die CellRow, wenn es ein ItemEvent in der JComboBox innerhalb der Zelle gibt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy