Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte)

GianaSisters

Bekanntes Mitglied
Hallo Zusammen,

wie es die Überschrift schon vermuten lässt beschäftigt mich eine ComboBox im jTable. Im Screenshot sieht man wie es momentan aussieht:

screen.jpg


Ziel ist es, dass nur 1 Combobox in der Spalte "B" jeweils zu einer potentielle Folge da ist, also nicht 3 ComboBoxen wie hier bei der ersten Folge ist. Die Größe der Combobox ist egal, sie kann gerne weiterhin in der ersten Zeile sein und muss nicht unbedingt alle 3 Zeilen umfassen. Die Berechnung die dahinter steckt sollte auch kein Problem sein. Allerdings wäre es natürlich toll wenn man einzelne Zellen ansprechen könnte, bei meiner jetztigen Programmierung geht es um die ganzen Spalten. Hier der Quelltext, vielleicht kann mir da jemand weiterhelfen.

Java:
  public void combosErstellen(int spalte, JTable table){
          
                 String[] values = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
                 TableColumn comboColumn = table.getColumnModel().getColumn(spalte);
                 comboColumn.setCellEditor(new MyComboBoxEditor(values));
                 comboColumn.setCellRenderer(new MyComboBoxRenderer(values));
           
            }

Java:
package fmea;

import java.awt.Component;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;

class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    public MyComboBoxRenderer(String[] items) {
        super(items);
    }

    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;
    }
}

Java:
package fmea;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
 
getTableCellRendererComponent hat doch die Parameter row und column... benutz sie 😉
Der Rückgabewert der Funktion ist Component, also kann man z.B. auch ein "leeres" Label o.ä. zurückgeben.

Reicht das an Tipps?
 
Hallo Verjigorm,

danke für die Antwort. Deinen Ideenansatz hab ich auch schon gehabt, aber ich denke die Stelle im getTableCellRendererComponent ist etwas zu spät. Ich kann es zwar unsichtbar machen, aber beim draufklicken geht dennoch die Combobox auf. Hier die Codeänderung:
Java:
public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        if (row>=3){

        if (isSelected) {
          // System.out.println(row);
           setForeground(table.getSelectionForeground());
           super.setBackground(table.getSelectionBackground());
        } else {
           setForeground(table.getForeground());
           setBackground(table.getBackground());
        }

        // Select the current value
        } else { return null;}
        setSelectedItem(value);
        return this;
    }
}

Gibt es vorher schon eine möglichkeit die ComboBox zu unterbinden ? Stehe da gerade was auf dem Schlauch 🙁
 
Den TableCellEditor musst du auch noch anpassen (denn der wird aufgerufen, wenn der Benutzer auf die Zelle klickt), seine Methode "getTableCellEditorComponent" erhält ebenfalls die row/column Parameter.

Oder im TableModel "isCellEditable" überschreiben.
 

Neue Themen


Zurück
Oben