2016-01-11 18 views
5

Poszukuję rozwiązania tego problemu: Mam plik programu Excel, który zawiera dane. Niektóre komórki mają żółte tło. Już stworzyłem kod do importowania tekstu do JTable, który działa dobrze. Ale chcę również zaimportować kolor komórki tła do konkretnych komórek. Dla uproszczenia tego przykładu nie używałem pętli, odczytu danych Excela ze źródła itp. Po przeczytaniu forum zrozumiałem, że potrzebuję CustomCellRenderer.Tylko komórki specyficzne dla koloru w JTable

Mam problem z tym podejściem, ponieważ ten kod początkowo poprawnie kolory komórek w kolumnie, ale kiedy zaczynam przewijać kolorowe komórki w tej tabeli, to całe kolumna powraca do żółtego. (patrz zrzut ekranu)

Pomyślałem, że mógłbym dodać instrukcję else, aby specjalnie zabarwić pozostałe komórki na białe, ale to podejście nie zadziała dla mnie, ponieważ nadpisałbym moje poprzednie wyniki komórek.

Czy możesz wskazać mi rozwiązanie tego problemu? (czy jest to błąd, czy oczekiwane zachowanie JTable?). Używam NetBeans i generator n drop GUI przeciągania

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

public class MyRenderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     int[][] coordinatesYellow = new int[3][2]; 
     //[row][column] these cells are yellow 
     coordinatesYellow[0][0] = 3; 
     coordinatesYellow[0][1] = 2; 
     coordinatesYellow[1][0] = 4; 
     coordinatesYellow[1][1] = 2; 
     coordinatesYellow[2][0] = 2; 
     coordinatesYellow[2][1] = 2; 

     for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
      } 
     } 
     return c; 
    } 
} 



// And this is the statement I use for calling the renderer: 
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer()); 
+0

@TT - Twój komentarz jest zasadniczo pełna odpowiedź. – tucuxi

+0

@tucuxi Prawda, brzmiało to tak banalnie, że zamieściłem komentarz. Uczyniłem to odpowiedzią. –

+0

Zobacz również http://stackoverflow.com/questions/22606227/colored-table-cells (może nawet być duplikatem ...) – Marco13

Odpowiedz

2

Zrób to tak, że gdy komórka nie powinny być żółte, które można ustawić tło na biały (lub stołu za kolor tła) .

renderujący, który rozciąga DefaultTableCellRenderer używa tego samego składnika (a JLabel) jako szablon do wszystkich komórek (por DefaultTableCellRenderer notach wdrożeniowych - nazywają go gumowe tłoczenia). Po ustawieniu koloru tła na żółty pozostanie żółty w celu renderowania kolejnych komórek, dopóki nie zmienisz ponownie koloru tła.

zastąpić pętli z czymś tak:

boolean isYellow = false; 
for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
       isYellow = true; 
      } 
     } 
if(!isYellow) 
    c.setBackground(Color.white); 
+0

To nie działa zgodnie z przeznaczeniem. Jeśli dodaję instrukcję else do pętli for, wynikiem jest tylko komórka sampletekstu w kolorze żółtym, ponieważ pętla for nadpisuje wyniki. – radox1912

+1

@ radox1912 W ** wszystkich ** przypadkach, w których kolor nie jest ustawiony na żółty ... Oznacza to, że jeśli nie ustawiłeś nic, aby kolor żółty, należy ustawić na biały. –

+0

@ radox1912 Dodałem segment kodu, który odzwierciedla moje oświadczenie. –

Powiązane problemy