• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JTable i zaimplementowanie renderer'a kolumn rozszerzając DefaultTableCellRenderer

+1 głos
505 wizyt
pytanie zadane 17 lutego 2016 w Java przez JGP Początkujący (270 p.)

Mam pewien kreator który zawiera tabelę ze stringami. W pewnych okolicznościach string może kończyć się białym znakiem, spacją. Chciałem by była możliwość podejrzenia sobie które to stringi zawierają takową spację. Przygotowałem do tego TableStringColRenderer, który rozszerza klasę DefaultTableCellRenderer. W nim napisałem odpowiedni if, który w razie czego wyszczególnia mi te specyficzne stringi.

private class TableStringColRenderer extends DefaultTableCellRenderer {
	private static final long serialVersionUID = 1239512400473884111L;
	JLabel lbl;
		
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
		if(drawEndsString.isSelected() && value.toString().trim().length() != value.toString().length()) {
			lbl = new JLabel("-->" + value.toString() + "<--");
			lbl.setFont(new Font(table.getFont().getFontName(), Font.BOLD, table.getFont().getSize()));
			return lbl;
		}
		else {
			lbl = new JLabel(value.toString());
			lbl.setFont(new Font(table.getFont().getFontName(), Font.PLAIN, table.getFont().getSize()));
			return lbl;
		}
	}
}

Jeśli JCheckBox "drawEndsString" jest zaznaczony i faktycznie string zawiera białe znaki na swoich krańcach to ten string wypisywany jest pogrubioną czcionką.

Problem o który chciałbym spytać to, że wcześniej, zanim używałem tego renderer'a, poprawnie działało mi wyświetlanie zaznaczenia danego wpisu. Po zaznaczeniu komórki, została ona podświetlona na typowo niebieski kolor. Odkąd używam tego renderer'a, te zaznaczenie nie działa. To znaczy, wpisy się zaznaczają ale nie jest to widoczne, nie widać niebieskiego zaznaczenia.

Czy to może mieć związek z tym, że w metodzie getTableCellRendererComponent jako string, zwracam JLabel? Lecz nie mam wyjścia, muszę zwrócić obiekt pochodny od Component - zwykłego Stringa dać nie mogę.

Co zrobić, żeby mieć zarówno funkcjonalność o której piszę i poprawnie renderowane zaznaczenie wpisu? Czy może nie tędy droga, używając TableStringColRenderer?

Dużo szukałem już na ten temat, ale bez skutku.

2 odpowiedzi

0 głosów
odpowiedź 18 lutego 2016 przez Javowiec Pasjonat (21,560 p.)
wybrane 18 lutego 2016 przez JGP
 
Najlepsza

W swoim Rendererze dodaj jeszcze kolorowanie komórki na niebiesko. Masz tylko pogrubianie czcionki labela. Coś w tym stylu (mój JList akurat składał się z JPaneli, więc zmieniałem kolor panela):

0 głosów
odpowiedź 18 lutego 2016 przez JGP Początkujący (270 p.)

Zapomniałem dodać, że próbowałem ustawiać background JLabel'ów i nie przynosiło to żadnych skutków, ale twój kod podsunął mi pomysł, żeby JLabel włożyć do JPanel i ten drugi zwrócić jako rezultat metody. W panelu jak ustawiam background to działa i o to mi chodziło więc dzięki wielkie wink
W konstruktorze JPanel przekazuję jedynie obiekt FlowLayout(FlowLayout.LEFT) aby mieć wyrównanie do lewej strony. Domyślnie stringi były wyśrodkowane.

Zastanawiam się jeszcze tak z ciekawości czy da radę jeszcze jakoś usunąć border:

Gdy edytuję jakiś wpis to wcięcie jest niewidoczne tak jak było w oryginale. Jednak poza tym wszystkie stringi są lekko odsunięte od lewej.

Próbowałem np dla label i panel ustawiać border null albo BorderFactory.createEmptyBorder(), ale nie przyniosło to żadnego efektu.

komentarz 18 lutego 2016 przez Javowiec Pasjonat (21,560 p.)

Border komórki nie jest częścią komórki, ale tabeli. Musisz to ustawić w instancji JTable metodą:

table.setShowGrid(false);

Żeby usunąć tylko górne lub boczne linie:

table.setShowHorizontalLines(false);
table.setShowVerticalLines(false);

A żeby zmienić kolor bordera:

table.setGridColor(color)
komentarz 18 lutego 2016 przez JGP Początkujący (270 p.)

Źle się jednak wyraziłem. Chodzi mi o to, czy da się zrobić tak żeby string był wyświetlany bliżej lewej krawędzi. Nie jak obecnie co na poprzednim screenie, ale jak na tym przykładzie:

Nie zależnie czy wpis jest edytowany czy nie, jest on pozycjonowany od lewej bez żadnego marginesu. Jestem ciekaw z czego to wynika.

Podobne pytania

0 głosów
2 odpowiedzi 759 wizyt
pytanie zadane 26 marca 2021 w Java przez PGR Obywatel (1,360 p.)
0 głosów
0 odpowiedzi 387 wizyt
pytanie zadane 21 czerwca 2018 w SQL, bazy danych przez manjaro Nałogowiec (37,390 p.)
0 głosów
1 odpowiedź 1,248 wizyt

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...