Swing JComboBox in einer Zeile

  • Themenstarter Themenstarter hansKanns
  • Beginndatum Beginndatum
H

hansKanns

Gast
Hallo zusammen,

ich würde gern bei meiner Suche die Möglichkeit einbauen die Suchart mit zu Hinterlegen. Diese soll in der 3 Zeile hinterlegt sein in Form einer JComboBox. Ich habs nun soweit schon geschaft das die Darstellung schon einmal Korrekt ist allerdings wenn ich die oberen beiden Zeilen anklicke wird immer der erste Wert der Combobox gesetzt warum? Was muss ich noch ändern?

Java:
public class SuchTable extends JTable {

	private static final long serialVersionUID = 4869797882559306187L;

	public SuchTable() {
		DefaultTableModel model = new DefaultTableModel();
		String[] ident = { "Suchwort", "Bezeichnung" };
		model.setColumnIdentifiers(ident);
		model.setRowCount(3);
		this.setModel(model);
		String[] values = {"Wert 1","Wert 2","Wert 3"};
		TableColumn col = this.getColumnModel().getColumn(0);
		col.setCellEditor(new ComboBoxEditor(values));
		col.setCellRenderer(new ComboBoxRenderer(values));
		col = this.getColumnModel().getColumn(1);
		col.setCellEditor(new ComboBoxEditor(values));
		col.setCellRenderer(new ComboBoxRenderer(values));
	}

	public class ComboBoxRenderer extends JComboBox implements TableCellRenderer {

		private static final long serialVersionUID = -6097075752647202913L;

		public ComboBoxRenderer(String[] 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());
			}
			if (row == 2) {
				super.setSelectedItem(value);
				return this;
			} else {
				return new JLabel(value == null ? "" : value.toString());
			}
		}

	}
	
	public class ComboBoxEditor extends DefaultCellEditor {

		private static final long serialVersionUID = -8432519253346229165L;

		public ComboBoxEditor(String[] items) {
			super(new JComboBox(items));
		}

		public Component getComponent() {
			return new JTextField();
		}

		public Component getTableCellEditorComponent(JTable table, Object value,
				boolean isSelected, int row, int column) {
			if (row == 2) {
				return super.getTableCellEditorComponent(table, value, isSelected,
						row, column);
			} else {
				return new JTextField(value == null ? "" : value.toString());
			}

		}

	}
}
 
Versuch's mal so:

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class SuchTable extends JTable {

    private static final long serialVersionUID = 4869797882559306187L;
    private final ComboBoxEditor comboBoxEditor;
    private final ComboBoxRenderer comboBoxRenderer;

    public SuchTable() {
        DefaultTableModel model = new DefaultTableModel();
        String[] ident = {"Suchwort", "Bezeichnung"};
        model.setColumnIdentifiers(ident);
        model.setRowCount(3);
        this.setModel(model);
        String[] values = {"Wert 1", "Wert 2", "Wert 3"};
        comboBoxEditor = new ComboBoxEditor(values);
        comboBoxRenderer = new ComboBoxRenderer(values);
    }

    @Override
    public TableCellEditor getCellEditor(int row, int column) {
        if (row == 2) {
            return comboBoxEditor;
        }
        return super.getCellEditor(row, column);
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        if (row == 2) {
            return comboBoxRenderer;
        }
        return super.getCellRenderer(row, column);
    }

    private class ComboBoxRenderer extends JComboBox implements TableCellRenderer {

        private static final long serialVersionUID = -6097075752647202913L;

        ComboBoxRenderer(String[] 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());
            }
            super.setSelectedItem(value);
            return this;
        }
    }

    private class ComboBoxEditor extends DefaultCellEditor {

        private static final long serialVersionUID = -8432519253346229165L;

        ComboBoxEditor(String[] items) {
            super(new JComboBox(items));
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            return super.getTableCellEditorComponent(table, value, isSelected,
                    row, column);
        }
    }

    public static void main(final String... args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        SuchTable table = new SuchTable();
        f.add(new JScrollPane(table));
        f.setVisible(true);
    }
}

Gruß,
André
 
Zuletzt bearbeitet:
Ich glaube die Frage verstanden zu haben.
Die Lösung:
Es muss noch in der
Code:
public Object getCellEditorValue()
des Editors definiert werden, welches Objekt als neues Datum an das TableModel übergeben wird.
Ansonsten scheinen mir da ein paar Sachen noch unsauber definiert zu sein.
Generell kann man Objekte mehrfach verwenden, man muss nicht dauernd neue erzeugen.
 
Vielen dank funktioniert super!

Hier mit entschuldige ich mich dafür den Renderer und den Editor immer wieder neu aufgerufen zuhaben!

Danke euch beiden!
 

Zurück
Oben