2016-09-01 5 views
1

Я сделал JTable, который содержит данныеJTable визуализатор цвет избежать инвертный цветов

"Марк", "Caissier", "0" "Жюльен", "Caissier", "1" "Джейсон", "Danceur", "2" "Мари", "Danceur", "3" "Джон", "Vendeur", "4"

для того чтобы увидеть все рабочие места легко, я хотел бы нарисовать один цвет по работе. Alternativly

Пример: Строка 0: цвет серый (потому что работа Caissier) Строка 1: цвет серый (потому что работа Caissier) Строка 2: розовый цвет (потому что работа изменилась Danceur) Ряд 3: цвет розовый (потому что работа снова Danceur) Строка 4: цвет серый (потому что работа Vendeur ...)

Кажется, работает, но я не знаю, почему, когда я нажимаю на строка, визуализатор снова вызван, а цвет меняется, а затем он не работает.

Итак, я решил вызвать jtable.repaint каждый раз, когда пользователь нажимает на строку. Но я делаю это, есть плохое событие. Все ряды, которые были розовыми, стали серыми, и весь ряд, который был серым, стал розовым. Я вставляю фрагмент кода. Вы видите ошибку, если вы запускаете JtableColor.java, а затем Жмите на ид 4, например, а затем нажмите на ид 2.

enter image description here

enter image description here

я поставил точку останова и пытается решить мою проблему , Я не нашел решения.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.util.Hashtable; 
import java.util.Vector; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 



public class JtableColor { 
public static void main(String args[]) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Object rowData[][] = { 
     { "Marc", "Caissier", "0" }, 
     { "Julien", "Caissier", "1" }, 
     { "Jason", "Danceur", "2" }, 
     { "Marie", "Danceur", "3" }, 
     { "John", "Vendeur", "4" } , 
    }; 

    Object columnNames[] = { "Prenom", "Job", "Id" }; 
    JTable table = new JTable(rowData, columnNames); 
    JScrollPane scrollPane = new JScrollPane(table); 

    rendererColor jtca1 = new rendererColor(); 
    for (int i=0;i<table.getColumnCount();i++){ 
     table.getColumnModel().getColumn(i).setCellRenderer(jtca1); 
    } 

    table.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseReleased(java.awt.event.MouseEvent evt) { 
      JTable table = (JTable) evt.getSource(); 
      table.repaint(); 
     } 
    }); 



    frame.add(scrollPane, BorderLayout.CENTER); 
    frame.setSize(300, 150); 
    frame.setVisible(true); 

} 
} 

class rendererColor extends DefaultTableCellRenderer { 

private String valueToString = ""; 
int colAScruter=-1; 
int couleur =0; 
Color couleurAMettre =Color.GREEN; 
Hashtable hash= new Hashtable(); 

public Component getTableCellRendererComponent(JTable table, 
     Object value, 
     boolean isSelected, 
     boolean hasFocus, 
     int row, 
     int columnt) { 

    Component c = 
      super.getTableCellRendererComponent(table, value, 
        isSelected, hasFocus, 
        row, columnt); 


    //Association d'une couleur à la table 
    int rowCount = table.getRowCount(); 
    String jobBefore = (String) hash.get("jobBefore"); 

    Vector listeCouleur = new Vector(); 
    listeCouleur.add(0,Color.PINK); 
    listeCouleur.add(1,Color.LIGHT_GRAY); 
    couleur = (Integer) hash.get("couleur"); 
    boolean change= true; 

    String job= (String) table.getValueAt(row,1); 

    if (jobBefore.equals("")){ 
     setBackground((Color)listeCouleur.get(couleur)); 

    } 
    else if (job.equals(jobBefore)){ 
     setBackground((Color)listeCouleur.get(couleur)); 
    } 
    else{ 
     if (couleur == 0) couleur=1; 
     else if (couleur == 1) couleur=0; 
     setBackground((Color)listeCouleur.get(couleur)); 

    } 
    hash.put("jobBefore",job); 
    hash.put("couleur",couleur); 



    return c; 
} 


public rendererColor() { 
    super(); 
    hash.put("jobBefore", ""); 
    hash.put("couleur",0); 

} 




} 
+0

'Для того, чтобы легко увидеть все вакансии, я хотел бы нарисовать один цвет по заданию. Тогда почему бы не цвет, основанный на значении в этом столбце?Прямо сейчас кажется, что ваш рендеринг зависит от предыдущего рендеринга, а не от фактических значений – copeg

+0

здесь У меня есть несколько вопросов о – mKorbel

ответ

1

Для того чтобы увидеть все рабочие места легко, я хотел бы нарисовать один цвет на работу.

Пример: Строка 0: цвет серый (потому что задача Caissier) Строка 1: цвет серый (потому что работа Caissier) Строка 2: цвет розовый (потому что работа изменилась для Danceur) Строка 3: цвет розовый (потому что работа снова Danceur) Строка 4: серый цвет (потому что работа Vendeur ...)

Рассмотрим окрашивания значения ячейки (ваш код прямо сейчас, кажется, зависит от предварительного рендеринга, например jobBefore). Например, чтобы окрасить все строки розовые, которые имеют значение Job как «Danceur»:

String job = (String)table.getValueAt(row,1); 
if (job.equals("Danceur")){ 
    setBackground(Color.PINK); 
}else{ 
    setBackground(Color.LIGHT_GRAY); 
} 

Это не принимает во внимание выбор - если вы хотите настроить цвет для выбора, вы можете сделать это путем проверки isSelected value. В качестве альтернативы просто использовать цвет интерфейса по умолчанию

if (isSelected){ 
    setBackground(UIManager.getColor("Table.selectionBackground")); 
} 

Там не должно быть необходимости перекрашивать с MouseListener, если вы действительно не нужно перекрашивать из-за изменения в логике для окрашивания на MouseEvent.

+0

Я не могу покрасить по значению ячейки, потому что я не знаю всех заданий. В будущем пользователь может добавить нового пользователя с новым заданием. Я не хотел бы жестко кодировать цвет по значению. Опция «Выбранная» не работает. – Patrick

+0

Как это предотвращает окраску по значению ячейки? И никакого жесткого кодирования не требуется ... используйте карту, связанную с этой ячейкой и ценную по цвету. Когда рендеринг проверяет, существует ли этот ключ карты, если он использует значение цвета. Если нет, создайте цвет и установите ключ/значение карты. – copeg

+0

Я не могу поместить цвета на карту. В будущем я добавлю поисковую систему. Если пользователь ищет работу Caissier и Vendeur, все строки будут розовыми или все в сером цвете .... – Patrick