2011-08-20 16 views
8

como he leído que no es posible para codificar mi lengua NavajoJTable fila hightlighter basado en el valor de TableCell

finging la manera cómo única alternativa/rayas de color en JTable (ejemplo @camickr)

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableRowRenderingTip extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public TableRowRenderingTip() { 
     Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"}; 
     Object[][] data = { 
      {"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE}, 
      {"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE}, 
      {"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE}, 
      {"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE}, 
      {"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.addTab("Alternating", createAlternating(model)); 
     add(tabbedPane); 
    } 

    private JComponent createAlternating(DefaultTableModel model) { 
     JTable table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       if (!isRowSelected(row)) { // Alternate row color 
        c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY); 
       } 
       return c; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     return new JScrollPane(table); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame.setDefaultLookAndFeelDecorated(false); 
     JFrame frame = new JFrame("Table Row Rendering"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableRowRenderingTip()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

tengo un JTable que contiene algunas operaciones de mercado (mejor para la comprensión por la razón mis conocimientos de inglés pobres), pero algunas de ofertas tiene una sola pierna, pero otro (por ejemplo de intercambio de vainilla Cross Currency) podría tener dos piernas. ¿Cómo se puede resaltar TableRows según el valor de los detalles TableColumn (por ejemplo, la última columna con el nombre DealId). Traté de comprobar row con row - 1 && row + 1, pero mi cabeza vacía generó muchos códigosRow, a la idea de cómo detener cosas sencillas simples complicadas, cómo comprobar si existe valor duplicado en otra fila (siempre con un orden estricto como se captura en las imágenes) Ni idea de cómo se implementa una fórmula simple para que

imágenes demostró:

enter image description here
enter image description here enter image description here

generado a partir de código:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TablePrepareRenderer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private Object[] columnNames = { 
     "Buy/Sell", "Type", "SubType", "Ccy1", "Amount1", "Ccy2", "Amount2", "DealId"}; 
    private Object[][] data = { 
     {"Buy&Sell", "Ccy Swap", "A1", "EUR", new Double(1000000.00), "USD", new Double(1439000.00), 50}, 
     {"Buy&Sell", "Ccy Swap", "A3", "USD", new Double(1438900.00), "EUR", new Double(1000000.00), 50}, 
     {"Buy&Sell", "Ccy Swap", "A1", "EUR", new Double(500000.00), "CHF", new Double(550000.00), 350}, 
     {"Buy&Sell", "Ccy Swap", "A1", "CHF", new Double(549800.00), "EUR", new Double(500000.00), 350}, 
     {"Sell&Buy", "Ccy Swap", "A3", "USD", new Double(1000000.00), "EUR", new Double(749000.00), 2250}, 
     {"Sell&Buy", "Ccy Swap", "A1", "EUR", new Double(748900.00), "USD", new Double(1000000.00), 2250}, 
     {"Buy&Sell", "Ccy Swap", "A1", "GBP", new Double(1000000.00), "USD", new Double(1638100.00), 400}, 
     {"Buy&Sell", "Ccy Swap", "A3", "USD", new Double(1638200.00), "GBP", new Double(1000000.00), 400}, 
     {"Sell", "Ccy Spot", "A1", "AUD", new Double(343575.0), "EUR", new Double(250000.0), 11990}, 
     {"Buy", "Ccy Spot", "A1", "EUR", new Double(100000.00), "JPY", new Double(1099000.00), 259}, 
     {"Sell", "Ccy Fwd", "A3", "DKK", new Double(74889.00), "EUR", new Double(10000.00), 115439},}; 
    private JTable table; 

    public TablePrepareRenderer() { 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 

     table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       JComponent jc = (JComponent) c; 
       /*if (!isRowSelected(row)) { 
       c.setBackground(getBackground()); 
       int modelRow = convertRowIndexToModel(row); 
       String type = (String) getModel().getValueAt(modelRow, 0); 
       if (("Buy".equals(type)) && !("Buy&Sell".equals(type))) { 
       c.setBackground(Color.orange); 
       } else if (("Sell".equals(type)) && !("Sell&Buy".equals(type))) { 
       c.setBackground(Color.orange); 
       } else if ("Buy&Sell".equals(type)) { 
       c.setBackground(Color.yellow); 
       } else if ("Sell&Buy".equals(type)) { 
       c.setBackground(Color.yellow); 
       } 
       }*/ 
       /*if (!isRowSelected(row)) { 
       if (row == 0 ||row == 1||row == 4||row == 6||row == 7||row == 9||row == 10) { 
       ((JComponent) c).setBackground(Color.orange); 
       } else { 
       ((JComponent) c).setBackground(Color.yellow); 
       } 
       }*/ 

       if (!isRowSelected(row)) { 
        if (row == 0 || row == 1 || row == 4 || row == 5 || row == 8 || row == 10) { 
         ((JComponent) c).setBackground(Color.orange); 
        } else { 
         ((JComponent) c).setBackground(Color.yellow); 
        } 
       } 

       if (column == 0 || column == 1 || column == 2 || column == 3 || column == 5) { 
        //setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
        //c.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
        //(JComponent) c.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
       } 
       return c; 
      } 

      @Override 
      public Class getColumnClass(int column) { 
       switch (column) { 
        case 0: 
         return String.class; 
        case 1: 
         return String.class; 
        case 2: 
         return String.class; 
        case 3: 
         return String.class; 
        case 4: 
         return Double.class; 
        case 5: 
         return String.class; 
        case 6: 
         return Double.class; 
        case 7: 
         return Integer.class; 
       } 
       return null; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) { 
     TablePrepareRenderer frame = new TablePrepareRenderer(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

Editar:

cómo configurar Alignment para TableCell en prepareRenderer,

+0

En este momento, ¿cuál es su objetivo final? ¿Qué imágenes de arriba muestran la salida deseada y qué imágenes muestran la salida actual? –

+0

@Hovercraft Full Of Eels para todas las combinaciones/imágenes posibles, y esperaba agrupar el marcador para todas las combinaciones posibles que existen, basado en el valor que devuelve TableCell – mKorbel

+0

¿Estás diciendo que las 3 imágenes muestran el color deseado? Parece que el color de la fila debería cambiar cada vez que cambia el valor 'dealld'? ¿Es ese el simple requisito o es más complejo que eso? – camickr

Respuesta

4

cómo configurar alineación para TableCell en prepareRenderer,

Esto no se debe hacer en el código prepareRenderer. Esta propiedad se debe establecer en el procesador para la clase o para la columna, ya que solo se aplica a una clase o representador específico. En lugar de usar:

table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
DefaultTableCellRenderer stringRenderer = (DefaultTableCellRenderer)table.getDefaultRenderer(String.class); 
stringRenderer.setHorizontalAlignment(SwingConstants.CENTER); 

Para el código resaltado Solía ​​código que supone que el valor dealld es único para un conjunto dado de transacciones:

 private Map<Object, Color> rowColor = new HashMap<Object, Color>(); 
     private Color nextColor = Color.ORANGE; 

     @Override 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
      Component c = super.prepareRenderer(renderer, row, column); 
      JComponent jc = (JComponent) c; 

      if (isRowSelected(row)) return c; 

      Object value = table.getValueAt(row, 7); 
      Color background = rowColor.get(value); 

      if (background != null) 
      { 
       c.setBackground(background); 
      } 
      else 
      { 
       rowColor.put(value, nextColor); 
       c.setBackground(nextColor); 
       nextColor = (nextColor == Color.ORANGE) ? Color.YELLOW : Color.ORANGE; 
      } 

      return c; 
     } 

Nota: No funcionará si se requiere la clasificación .

Aquí hay otro enfoque que debería funcionar incluso si se requiere clasificación (pero no lo probé con la clasificación);

 @Override 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
      Component c = super.prepareRenderer(renderer, row, column); 
      JComponent jc = (JComponent) c; 
      if (!isRowSelected(row)) 
      { 
       c.setBackground(getRowBackground(row)); 
      } 

      return c; 
     } 

     private Color getRowBackground(int row) 
     { 
      boolean isDark = true; 

      Object previous = getValueAt(0, 7); 

      for (int i = 1; i <= row; i++) 
      { 
       Object current = getValueAt(i, 7); 

       if (! current.equals(previous)) 
       { 
        isDark = !isDark; 
        previous = current; 
       } 
      } 

      return isDark ? Color.ORANGE : Color.YELLOW; 
     } 
+0

gracias por eso +1 – mKorbel

2

es domingo, deatherting del tiempo, así que no pude resistir mostrar la versión de SwingX.Es la misma lógica que @camickr segundo, gracias :-)

Ventajas:

  • código pueden centrarse en la lógica como el valor de recuperación de asas de clasificación/filtrado/columna mueve automagicamente
  • sabe de forma predeterminada ui colores de trazado alterno (y actualizaciones al cambiar LAF)
  • Soporte de resaltador incorporado, no hay necesidad de subclasificar la tabla ni preocuparse por la mala conducta del procesador
  • fácil de agregar marcadores adicionales (Vender gritando, vender, vender :-)

El código snipped:

JXTable table = new JXTable(data, columnNames); 
HighlightPredicate predicate = new HighlightPredicate() { 

    @Override 
    public boolean isHighlighted(Component renderer, 
      ComponentAdapter adapter) { 
     if (adapter.row == 0) return false; 
     return isOddValue(adapter); 
    } 

    private boolean isOddValue(ComponentAdapter adapter) { 
     Object previous = adapter.getFilteredValueAt(0, 7); 
     boolean odd = false; 
     for (int i = 1; i <= adapter.row; i++) { 
      Object current = adapter.getFilteredValueAt(i, 7); 
      if (!previous.equals(current)) { 
       odd = !odd; 
      } 
      previous = current; 
     } 
     return odd; 
    } 

}; 
table.addHighlighter(new UIColorHighlighter(predicate)); 
+0

extraño Primavera y verano en Europa continental +1 – mKorbel

Cuestiones relacionadas