2017-06-07 3 views
0

Est-ce que JTable prend en charge le formatage conditionnel 3 couleurs comme le fait Excel. Exemple: enter image description hereJtable avec mise en forme conditionnelle comme Excel

J'ai vérifié sur Google et tout ce que je pourrait trouver assigner une seule couleur à la fois à une cellule qui correspond aux critères. Je me demandais si je pouvais simplement fournir trois couleurs et Jtable attribuerait des nuances de couleur en fonction de la valeur de la cellule.

Répondre

1

Voici l'une des façons, comment vous pouvez le faire. Classes supplémentaires, nous pouvons trouver here.

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.AbstractListModel; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JViewport; 
import javax.swing.ListCellRenderer; 
import javax.swing.ListModel; 
import static javax.swing.SwingConstants.CENTER; 
import javax.swing.UIManager; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 

import general.VerticalTableHeaderCellRenderer; 
import java.awt.Color; 
import java.util.Random; 
import javax.swing.table.TableCellRenderer; 

// The class of template for table's presentation of knowledge 
//==============================================================================  
public class ExcelTable extends JFrame { 

    public static int rowCount = 1024; 
    public static int colCount = 1024; 
    public static int CHLength = 100; 
    public static int RWLength = 50; 
    public static int DCW = 20; 

// The constructor of this class 
//==============================================================================  
    public ExcelTable() { 
     super("Draw cell rotate"); 
     setSize(400, 400); 

     //The abstract model of table's presentation 
     ListModel lm = new AbstractListModel() { 
      String[] headers = new String[rowCount]; 

      @Override 
      public int getSize() { 
       return headers.length; 
      } 

      @Override 
      public Object getElementAt(int index) { 
       return headers[index]; 

      } 
     }; 

     DefaultTableModel dtm = new DefaultTableModel(lm.getSize(), colCount); 
     JTable table = new JTable(dtm) { 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       Component comp = super.prepareRenderer(renderer, row, col); 
       Object value = getModel().getValueAt(row, col); 
       setCellSelectionEnabled(true); 

// Here you can write you schemes 
       final Random r = new Random(); 
       Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256), r.nextInt(256)); 

       if (getSelectedRow() != 0) { 
        if (row % 2 == 0 && col % 2 == 1) { 
         comp.setBackground(c); 
        } else if (row % 2 == 1 && row % 2 == 1) { 
         comp.setBackground(c); 
        } else { 
         comp.setBackground(c); 
        } 
       } else { 
        comp.setBackground(Color.white); 
       } 
       return comp; 
      } 
     }; 
     table.getTableHeader().setDefaultRenderer(new VerticalTableHeaderCellRenderer()); 
     for (int i = 0; i < colCount; i++) { 
      table.getColumnModel().getColumn(i).setPreferredWidth(DCW);// .setTotalColumnWidth(); 
     } 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

     table.setCellSelectionEnabled(true); 

     // Create header rotation 
     JList rowHeader = new JList(lm); 
     // if (fieldlength) 
     rowHeader.setFixedCellWidth(RWLength); //RowHeaser width 
     rowHeader.setFixedCellHeight(table.getRowHeight()); 

     //Set render 
     rowHeader.setCellRenderer(new RowRenderer(table)); 

     //JScrollPane 
     JScrollPane pane = new JScrollPane(table); 
     pane.setColumnHeader(new JViewport() { 
      @Override 
      public Dimension getPreferredSize() { 
       Dimension d = super.getPreferredSize(); 
       d.height = CHLength; // Col header Height 
       return d; 
      } 
     }); 
     pane.setRowHeaderView(rowHeader); 
     getContentPane().add(pane, BorderLayout.CENTER); 

    } 

//========================================= 
    public static void main(String[] args) { 
     ExcelTable jr = new ExcelTable(); 
     jr.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     jr.setVisible(true); 
    } 
} 

class RowRenderer extends JLabel implements ListCellRenderer { 

    public RowRenderer(JTable table) { 
     JTableHeader header = table.getTableHeader(); 
     setOpaque(true); 
     setBorder(UIManager.getBorder("TableHeader.cellBorder")); 
     setHorizontalAlignment(CENTER); 
     setForeground(header.getForeground()); 
     setBackground(header.getBackground()); 
     setFont(header.getFont()); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     setText((value == null) ? "" : value.toString()); 
     return this; 
    } 
} 

SORTIE: enter image description here

aussi: enter image description here ou enter image description here

Le schéma souhaité vous devez mettre en œuvre dans la méthode de remplacement:

@Override 
    public Component prepareRenderer 
    (TableCellRenderer renderer, int row, int col 

     ) { 
       Component comp = super.prepareRenderer(renderer, row, col); 
     Object value = getModel().getValueAt(row, col); 
     setCellSelectionEnabled(true); 

    // Here you can write you schemes in RGB 
// of course you need to describe it before mathematicaly 
// and using variable `row` and `col` you will have coordinates to the cells 
     final Random r = new Random(); 
     int R = r.nextInt(Math.round(256/(row + 1))); 
     int G = r.nextInt(Math.round(256/(col + 1))); 
     int B = r.nextInt(Math.round(256/(row + col + 1))); 
     Color c = new Color(R, G, B); 

     if (getSelectedRow() != 0) { 
      if (row % 2 == 0 && col % 2 == 1) { 
       comp.setBackground(c); 
      } else if (row % 2 == 1 && row % 2 == 1) { 
       comp.setBackground(c); 
      } else { 
       comp.setBackground(c); 
      } 
     } else { 
      comp.setBackground(Color.white); 
     } 
     return comp; 
    } 
}; 
+0

isnt il suffit de définir deux couleurs, rouge et vert. Je cherche des nuances de couleur. juste comme mon exemple, la nuance de couleur doit changer selon la valeur – user1631306

+1

aussi, où puis-je trouver "VerticalTableHeaderCellRenderer" class – user1631306

+0

Encore une fois, je vois que vous attribuez trois couleurs à trois conditions différentes. J'essaie de faire un heatmap, dans lequel il y aurait un dégradé de couleurs. Comment puis je faire ça. – user1631306