2014-07-20 2 views
4

salut je suis nouveau dans java jtable cellrendered. Je suis à la recherche d'un moyen qui fonctionne dans mon programme mais je n'ai pas de chance de le trouver. Voici mon jtableModifier la couleur d'arrière-plan de la ligne JTable en fonction de la valeur de la colonne

Employee ID | Name  | Status | Position 
    00565651  Roger  Active  Manager 
    00565652  Gina  Active  Crew 
    00565652  Alex  Inactive  Crew 
    00565652  Seph  Active  Manager  

les données proviennent de la base de données d'accès ms, mais je veux changer l'arrière-plan/avant-plan des lignes qui a une valeur de « inactif » dans la colonne d'état. J'ai trouvé de nombreux exemples sur Internet, mais tout cela n'est pas possible dans mon programme. Est-ce que quelqu'un peut m'aider? Ceci est mon modèle

String[] columnNames = {"Employee ID","Name", "Status", "Position"}; 
DefaultTableModel model = new DefaultTableModel(columnNames, 0); 

ce qui est la façon de créer ma table et comment je suis extraire des données de base de données

public MyList(){//my constructor 
    frame(); 
    loadListFromDB(); 
} 
public void frame(){// 
    //codes for frame setsize,titles etc... 
    tblList = new JTable(); 
    tblList.getTableHeader().setPreferredSize(new Dimension(100, 40)); 
    tblList.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 25)); 
    tblList.setAutoCreateRowSorter(true); 
    tblList.setModel(model); 
    scrollPane.setViewportView(tblList); 
    loadListFromDB(); 

} 
public void loadListFromDB(){ 
    String sql = "SELECT emp_id,lname,fname,positional_status from tblEmployee"; 
    try{ 
     PreparedStatement ps = conn.prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()){ 
      Vector row = new Vector(); 
      for (int i = 1; i <= 4; i++){ 
       row.addElement(rs.getObject(i)); 
      } 
      model.addRow(row); 
     } 
    }catch(Exception err){ 
     //for error code 
    } 
} 

Comment suis-je supposé ajouter le tableredered de cette façon? Quelqu'un peut-il donner un exemple simple pour changer la couleur de la ligne? Merci d'avance .. Mon programme s'arrête dans ce problème.

+0

double possible de [Comment définir la colonne JTable et la couleur de la ligne?] (Http://stackoverflow.com/questions/3548986/how-do-i-set-the-jtable-column-and -row-color) – DavidPostill

+0

mais les données ont été initialisées dès le début, mes données proviennent de la base de données, je ne sais pas comment mettre mes données en string [] [] base sur votre exemple. –

+0

Vous n'êtes pas question de mettre les données dans la table mais de changer la couleur de la ligne. Vous devriez regarder la partie 'TableCellRenderer' de l'exemple - et ajouter le rendu à votre table. – DavidPostill

Répondre

14

« je veux changer l'arrière-plan/avant-plan des lignes qui a une valeur de « inactif » dans la colonne d'état »

Il est vraiment juste une question d'obtenir la valeur de la table/modèle. Si le statut de cette ligne est inactif, définissez l'arrière-plan/premier plan pour chaque cellule de cette ligne. Puisque le rendu est rendu pour chaque cellule, vous devez obtenir la valeur du [row][statusColumn], et ce sera la valeur de statut pour chaque ligne. Quelque chose comme

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, int col) { 

     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 

     String status = (String)table.getModel().getValueAt(row, STATUS_COL); 
     if ("active".equals(status)) { 
      setBackground(Color.BLACK); 
      setForeground(Color.WHITE); 
     } else { 
      setBackground(table.getBackground()); 
      setForeground(table.getForeground()); 
     }  
     return this; 
    } 
}); 

Voici un exemple simple

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TableRowDemo { 

    private static final int STATUS_COL = 1; 

    private static JTable getTable() { 
     final String[] cols = {"col 1", "status", "col 3"}; 
     final String[][] data = { 
       {"data", "active", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "active", "data"} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, cols); 
     return new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(350, 150); 
      } 
     }; 
    } 

    private static JTable getNewRenderedTable(final JTable table) { 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable table, 
        Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 
       String status = (String)table.getModel().getValueAt(row, STATUS_COL); 
       if ("active".equals(status)) { 
        setBackground(Color.BLACK); 
        setForeground(Color.WHITE); 
       } else { 
        setBackground(table.getBackground()); 
        setForeground(table.getForeground()); 
       }  
       return this; 
      } 
     }); 
     return table; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new JScrollPane(getNewRenderedTable(getTable()))); 
      } 
     }); 
    } 
} 

Une autre option est de @Override prepareRenderer de la table. Cela vous donnera le même résultat.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class TableRowDemo { 

    private static final int STATUS_COL = 1; 

    private static JTable getTable() { 
     final String[] cols = {"col 1", "status", "col 3"}; 
     final String[][] data = { 
       {"data", "active", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "active", "data"} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, cols); 
     return new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(350, 150); 
      } 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       Component c = super.prepareRenderer(renderer, row, col); 
       String status = (String)getValueAt(row, STATUS_COL); 
       if ("active".equals(status)) { 
        c.setBackground(Color.BLACK); 
        c.setForeground(Color.WHITE); 
       } else { 
        c.setBackground(super.getBackground()); 
        c.setForeground(super.getForeground()); 
       } 
       return c; 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new JScrollPane(getTable())); 
      } 
     }); 
    } 
} 
+0

Merci beaucoup, c'était exactement ce que je cherchais ... – Zohaib

+0

Grande réponse Je cherchais ça. pouvons-nous changer le style des en-têtes de la table en même temps? –

+0

@peeskillet Comment la méthode prepare renderer peut-elle être modifiée pour changer la colonne au lieu de la couleur d'arrière-plan de la ligne? – Aequitas

Questions connexes