2017-07-10 3 views
0

J'essaie de changer l'arrière-plan d'une cellule JTable, en fonction de la valeur de la cellule de la colonne -1. Donc, si une valeur de cellule à [ligne, colonne] est différente de valeurs données, par exemple "A", "B", alors changez l'arrière-plan de la cellule donnée et de la cellule à [ligne, colonne + 1]Comment changer un backgound de cellule de JTable basé sur la valeur de la cellule précédente?

Voici ce que je reçois maintenant:

enter image description here

ce que je veux est la suivante:

enter image description here

I u sed une cellule personnalisée rendue, mais je ne peux pas réaliser cette exigence.

Ceci est mon code:

import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.io.IOException; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TestCellRendered { 

    private JFrame frame; 
    private JTable table; 

    private DefaultTableModel model; 
    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TestCellRendered window = new TestCellRendered(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    * @throws IOException 
    */ 
    public TestCellRendered() throws IOException { 
     initialize(); 

    } 



    /** 
    * Initialize the contents of the frame. 
    * @throws IOException 
    */ 
    private void initialize() throws IOException { 
     frame = new JFrame(); 
     frame.setResizable(false); 
     frame.setBounds(100, 100, 975, 756); 
     frame.getContentPane().setLayout(null); 

     model = new DefaultTableModel(); 
     model.addColumn("À remplacer"); 
     model.addColumn("Lignes"); 
     table = new JTable(model); 
     MyRenderer myRenderer = new MyRenderer(); // See below 
     table.setDefaultRenderer(Object.class , myRenderer); 
     table.setBackground(Color.LIGHT_GRAY); 
     Font font = new Font("",1,14); 
     table.setForeground(Color.black); 
     table.setFont(font); 
     //Add rows to my table 
     model.addRow(new Object[]{"a",""}); 
     model.addRow(new Object[]{"b", ""}); 
     model.addRow(new Object[]{"c", ""}); 


     JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.setBounds(66, 66, 519, 421); 
     frame.getContentPane().add(scrollPane); 


    } 
    class MyRenderer extends DefaultTableCellRenderer 
    { 
     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); 

     if (! table.isRowSelected(row)) 
     { 
      if(!(value.equals("a") |value.equals("b"))) 
       { 
       c.setBackground(new java.awt.Color(231, 76, 60)); 
       c.setForeground(new java.awt.Color(255,255,255)); 
       } 
      else{ 
       c.setBackground(table.getBackground()); 
       c.setForeground(table.getForeground()); 
      } 
     } 


     return c; 
    } 

    } 
} 

Répondre

2

en fonction de la valeur de la cellule de la colonne -1.

if(!(value.equals("a") |value.equals("b"))) 

Eh bien, vous faites toujours le test sur la colonne en cours. Vous devez faire le test sur la première colonne:

String text = table.getValueAt(row, 0).toString(); 

if(!(text.equals("a") |text.equals("b"))) 

note, il est généralement plus facile d'écrire du code dans une instruction if avec un test positif:

if (text.equals("a" || text.equals("b")) 
{ 
    c.setBackground(table.getBackground()); 
    c.setForeground(table.getForeground()); 
} 
else 
{ 
    c.setBackground(new java.awt.Color(231, 76, 60)); 
    c.setForeground(new java.awt.Color(255,255,255)); 
} 
+0

Merci, oui je l'ai testé toujours la colonne en cours , Merci beaucoup ;) – Yacino