/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.studio.tables.grid; import java.awt.*; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.text.DecimalFormat; import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.LineBorder; import javax.swing.table.TableCellRenderer; class CellRenderer implements TableCellRenderer { private final Color alternateColour = new Color(230, 230, 250); private final Font boldFont; private final boolean firstRowIsHeader; private final Border headerBorder = new LineBorder(new Color(100, 100, 100), 1) { /** * */ private static final long serialVersionUID = 1L; @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { if ((this.thickness > 0) && (g instanceof Graphics2D)) { Graphics2D g2d = (Graphics2D) g; Color oldColor = g2d.getColor(); g2d.setColor(this.lineColor); Shape outer = new Rectangle2D.Float(x, y + height - thickness, width, thickness); Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD); path.append(outer, false); g2d.fill(path); g2d.setColor(oldColor); } } }; private final JLabel label = createLabel(); private final Color mainColour = new Color(250, 250, 230); private final Font normalFont; private final Color selectedColour = new Color(100, 150, 200); private final NumberFormat nf = NumberFormat.getInstance(); //new DecimalFormat("####0.000"); private final Border focusedBorder = BorderFactory.createLineBorder(Color.BLACK, 2); public CellRenderer(boolean firstRowIsHeader) { normalFont = label.getFont(); boldFont = new Font(normalFont.getFontName(), Font.BOLD, normalFont.getSize()); this.firstRowIsHeader = firstRowIsHeader; } protected static JLabel createLabel(){ JLabel label = new JLabel(); label.setOpaque(true); label.setHorizontalAlignment(SwingConstants.LEFT); return label; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return prepareLabel(value, isSelected, hasFocus, row, column); } protected JLabel prepareLabel(Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value != null) { if (Number.class.isInstance(value)) { label.setText(nf.format(value)); } else { label.setText(value.toString()); } } else { label.setText(""); } label.setForeground(Color.BLACK); if (isSelected) { label.setBackground(selectedColour); } else if (row % 2 == (firstRowIsHeader ? 1 : 0)) { label.setBackground(mainColour); } else { label.setBackground(alternateColour); } Border border = null; Font font = normalFont; if (firstRowIsHeader && row == 0) { font = boldFont; border = headerBorder; } else if(hasFocus){ border = focusedBorder; } if (label.getFont() != font) { label.setFont(font); } if (label.getBorder() != border) { label.setBorder(border); } return label; } }