JTable + JCheckBox

0

Witam
Mam mały problem. Mam tabele i dodaje do niej jakies tam dane. W jednej z kolumn chce wyswietlic JCheckBox. I prawie mi sie udaje, ale zamiast wyświetlac mi sie ten kwadracik to mam text true albo false. Jak klikam na ten wiersz to na chwilke pojawia sie kwadracik JCheckBox, odznacza/zaznacza sie poczym znowu mam text true/false. Jak zrobic, aby zamiast textu ciągle był ten kwadracik. Na toturialu na java sun jest niby cos takiego, ale nie ma opisane jak to zrobic(przynajmniej ja sie nie dopatrzyłem).

Wie ktos moze jak to rozwiązac?

0

Użyć własnego TableCellRenderer.

public class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {

	private static final long serialVersionUID = 7579063943082168764L;
	
	protected static Border normalBorder = new EmptyBorder(1, 1, 1, 1);
		
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		if (isSelected) {
			setForeground(table.getSelectionForeground());
			setBackground(table.getSelectionBackground());
		} else {
			setForeground(table.getForeground());
			setBackground(table.getBackground());
		}

		if (hasFocus) {
			setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
		} else {
			setBorder(normalBorder);
		}		
		this.setHorizontalAlignment(SwingConstants.CENTER);		  
		setSelected((Boolean) value);
		return this;
	}
}
0

Nie jest potrzebny własny CellRenderer jeśli dane wyświetlane w komórce są typu Boolean (a nie boolean)
pozdrawiam

0

Nameczyłem sie, a mimo to nie działa. Niby pojawiły sie kwadraciki, ale niemogłem dac im ptaszka. Uzyłem troszke lamerskiego JComoBox z opcja Tak/Nie. Może potem poprawie.

0

Wystarczy, ze stworzysz wlasny model tabeli, na jeden z dwoch sposobow:

  1. Rozszerzysz klase [i]DefaultTableModel[i], ktora uzywa [i]Vector'a[/i] do przechowywania rekordow;
  2. Rozszerzysz klase [i]AbstractTableModel[/i], w ktorej zaimplementujesz wlasny mechanizm gromadzenia i prezentowania danych.
    ... a nastepnie przeciazysz metody:
  3. [i]Class<?> getColumnClass(int)[/i], aby dla konkretnej kolumny zwracala [i]Boolean.class[/i];
  4. [i]void setValueAt(Object, int, int)[/i], aby mozna bylo modyfikowac zawartosc pola tabeli;
  5. [i]boolean isCellEditable(int, int)[/i], okreslajaca, czy pole tabeli mozna edytowac.
    Renderer automatycznie dobierze odpowiedni komponent.
0

Ja bym zrobił tak:

  1. Tworzysz klase implementującą TableCellRenderer
import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

class JComponentRenderer implements TableCellRenderer {
	 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		return (JComponent)value;
  	}
}

Następnie, tworzysz klase dziedziczącą po JTable:

public class MojaTabela extends JTable {
//...
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
		Component c = super.prepareRenderer( renderer, row, column);
		if( c instanceof JComponent )
			((JComponent)c).setOpaque(true);
		return c;
	}
//...
}

Jako, że dane tabeli, są typu Object możesz dodać tam JCheckBox.
Mój przykład działa dla JLabel, myślę, że dla JCheckBox również powinien działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1