Trzy pytania w temacie JTable

Trzy pytania w temacie JTable
Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

Hej,

Pyt 1.
Czy można zmieniać BackgroundColor każdej komórki z osobna (w zależności od fluktuacji jakiejś zmiennej zmienia się również kolor tła danej komórki w JTable)?

Pyt 2.
Czy można zaznaczać wiele pojedynczych komórek na raz tradycyjnie z wciśniętym CTRL'em (tzn. sprawić by JTable pamiętało o wcześniej zaznaczonych pojedynczych komórkach - MULTIPLE selection model niestety się nie sprawdza, gdyż zaznacza interwałowo komórki, a nie pojedynczo, te które wybrałem wcześniej)?

Pyt 3.
Czy można zmienić styl zaznaczania tak, by podczas zaznaczenia komórek zmieniało się ich obramowanie, a nie tło (czyli tło pozostaje cały czas np. białe, a obramowanie zmienia kolor na np. niebieski)?

Będę niezmiernie wdzięczny za odpowiedzi i porady.

Pozdrawiam ciepło!


The quieter you become, the more you are able to hear.
edytowany 1x, ostatnio: Gjorni
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

1, 2 i 3. Tak (MULTIPLE się sprawdza).


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

To wspaniale! :) A czy mogę jeszcze prosić o delikatne rozwinięcie odpowiedzi w kierunku ich praktycznej implementacji? :)


The quieter you become, the more you are able to hear.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Możesz.

Kopiuj
JTable table = new JTable(...);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//pętla po kolumnach, dla każdej kolumny kol, którą chcesz nietypowo rysować
  kol.setCellRenderer(new MyRendererThisColumn());

Przykładowy kod własnego renderera dla kolumny, w której są liczby całkowite:

Kopiuj
class MyRendererThisColumn implements TableCellRenderer
{
    //------------------------
    public Component getTableCellRendererComponent(JTable t,Object value,boolean selected,boolean hasFocus,int row,int col)
    {
        Integer i = (Integer)value;
        JLabel cell=new JLabel(""+i);
        if(i<0)
        {
            cell.setBackground(Color.RED);
        }
        return cell;
    }
}

Kod nie testowany.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

A właśnie, widzisz! Zapomniałem napomknąć, że zależy mi na wprowadzaniu zmian w pustej komórce. Właśnie ze względu na chęć uniknięcia korzystania z JLabeli :/ Mam macierze nawet po 4000 elementów więc stąd też moje zawzięte poszukiwania sposobu na zmianę BG pustej komórki :/


The quieter you become, the more you are able to hear.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

A dlaczego nie JLabel? Jest za wolny?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

Wiesz, chciałbym by komórka reagowała tylko na 3 stany - 1 stan, to informacja o zaznaczeniu jakiegoś innego elementu w innej klasie i na tej podstawie pojawia się owo np. niebieskie obramowanie komórki JTable (ale bez ingerencji w tło); 2 stan, to zmieniająca się dynamicznie wartość jakiegoś wektora, która odzwierciedla się zmianą tła komórki w JTable; 3 stan, to też wartość jakiegoś wektora i skutkuje pisaniem jakiegoś tekstu w komórce w zależności od zmian wartości zmiennej (np. wyświetla 1, 2, 3 itd.). Wszystko to fajnie można osiągnąć z JLabelami i super można też załatwić kwestię obramowania reagującego na zaznaczanie czegoś innego w innej klasie, ale kłopotem jest implementacja tylu JLabeli no i fakt, że fakt faktem są wolne troszkę :/ Dlatego tak zawzięcie szukam możliwości działania na pustych komórkach. Gdyby można było zmieniać tło dla pojedynczej pustej komórki to byłoby wspaniale.


The quieter you become, the more you are able to hear.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0
  1. Do wyświetlenia dowolnej komórki w tabeli służy jakiś komponent, JLabel jest z nich wszystkich najwolniejszy?
  2. Nie ma implementacji wielu komórek, jest jedna metoda getTableCellRendererComponent wyświetlająca wszystkie komórki w kolumnie, a można tak podpiąć własnego renderera, że jedna metoda wyświetla wszystkie komórki tabeli.
  3. Po zmianach w modelu (zmianach zawartości komórek) trzeba wywołać metodę fireTableDataChanged lub jakąś pokrewną, dokładniej informującą co się zmieniło (komórka, wiersz). Jak się obawiasz wolnego odświeżania, to wywołuj precyzyjna metodę.Ja stosuje bardzo wymyślne wyświetlania i nie zauważyłem żadnego opóźnienia.
  4. Mam wrażenie, że nie rozumiesz jak działa JTable.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 12 lat
0

Spróbuj zamiast implementować TableCellRenderer'a rozszerzyć klasę DefaultTableCellRenderer, która zaimplementowana jest tak, aby zwiększyć wydajność rysowania komórek.
http://docs.oracle.com/javase/6/docs/api/javax/swing/table/DefaultTableCellRenderer.html

Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

@bogdans, tworzę tabelę np.

Kopiuj
Object data[][] = new Object[4][4]; // ew. zamiast Object - int, string cokolwiek.
String header[] = {"a", "b", "c", "d"};
JTable table = new JTable(data, header);

// I teraz dodaje tabelę, ustawiam jej model, edytowalność itd. W każdym razie wszystkie pola tablicy data[][] są null, nic tam nie ma. Mogę zmienić np. bgColor globalnie dla JTable, ale.. 

..czy mogę zmienić bg dla pojedynczej komórki, która ma określone rozmiary i inne właściwości, ale jest pusta, nie zawiera żadnych obiektów, ani danych? To mnie nurtuje. Bo mogę przecież selektywnie komórki zaznaczać itd, ale szukam możliwości zmiany tła pojedynczej komórki. Pobieram sobie np. index tablicy data[][], który jest przypisany danej komórce, dla której chcę zmienić tło w danym momencie i to robię, ale komórki nie posiadającej żadnego obiektu. O to się cały czas rozchodzi.


The quieter you become, the more you are able to hear.
lemmiwink
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 12 lat
1

Ech..., tak jak napisał bogdans, nie rozumiesz jak to działa. Więc po kolei: kiedy JTable chce narysować komórkę o współrzędnych (row, col) najpierw pobierany jest obiekt TableCellRenderer dla kolumny col, a następnie pobierana jest wartość komórki (row, col) poprzez wywołanie metody getValue(...) z modelu (lub odwrotnie, ale to nie ma znaczenia). Następnie jest wywoływana metoda getTableCellRendererComponent z odpowiednio ustawionymi parametrami. Ta metoda zwraca komponent, który zostanie narysowany w miejscu komórki (row, col).
Prześledź poniższy kod, powinien Ci to rozjaśnić. Pamiętaj, że DefaultTableCellRenderer sam dziedziczy po JLabel:

Kopiuj
...
Object data[][] = new Object[4][4];
String header[] = {"a", "b", "c", "d"};
JTable table = new JTable(data, header);
		
data[0][3] = 1;
data[3][2] = "aaaa";
data[1][1] = 3;
data[2][0] = 1.111;
	
TableCellRenderer renderer = new MyTableCellRenderer();
		
for (int i = 0; i < table.getColumnCount(); i++) {
	table.getColumnModel().getColumn(i).setCellRenderer(renderer);			
}
...

class MyTableCellRenderer extends DefaultTableCellRenderer {
		
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		if (row == 1 && column == 2) { // ustawienie wyglądu w zależności od numeru komórki
			setBackground(Color.LIGHT_GRAY);
		} else {
			setBackground(Color.WHITE);				
		}
			
		if (value == null) { // ustawienie wyglądu w zależności od zawartości koórki
			setBorder(BorderFactory.createLineBorder(Color.RED));
			setText("");
		} else {
			if (value instanceof Integer) {
				setBorder(BorderFactory.createLineBorder(Color.GREEN));					
			} else if (value instanceof Double) {
				setBorder(BorderFactory.createLineBorder(Color.BLUE));
			} else {
				setBorder(BorderFactory.createLineBorder(Color.BLACK));
			}
			setText(value.toString());
		}		
		return this;		
	}	
}
Gjorni
  • Rejestracja:około 12 lat
  • Ostatnio:około 3 lata
0

To prawda, nie rozumiałem mechaniki. Jednak dzięki Wam JTable odkryło choć część swych sekretów :) Widzę też, że tak czy siak będę miał do czynienia z JLabelami, czego tak bardzo chciałem uniknąć. No cóż, nie pozostaje nic innego jak siadać do czytania i pisania w celu doskonalenia rozumienia mechaniki działania :)

Bardzo wam dziękuję za pomoc w otworzeniu kolejnych drzwi w javie.

Pozdrawiam ciepło :)


The quieter you become, the more you are able to hear.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)