/* * Created on 15.02.2013 * */ package org.jdesktop.swingx.renderer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Random; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.synth.SynthLookAndFeel; import javax.swing.table.AbstractTableModel; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.HighlightPredicate; import org.jdesktop.swingx.decorator.HighlighterFactory; import org.jdesktop.swingx.decorator.PainterHighlighter; import org.jdesktop.swingx.painter.ImagePainter; import org.jdesktop.swingx.painter.MattePainter; import org.jdesktop.swingx.test.XTestUtils; import org.jdesktop.swingx.util.PaintUtils; /** * Issue 1546-swingx: striping lost in synth-based LAFs (Regression 1.6.5) * * @author Wolfgang Zitzelsberger * @author Jeanette Winzenburg */ public class SynthCheckBoxPainterTest extends JFrame { private static String synthXml = "<synth>" + " <style id=\"all\">" + " <font name=\"Tahoma\" size=\"11\"/>" + " </style>" + " <bind style=\"all\" type=\"REGION\" key=\".*\"/>" + " <style id=\"checkbox\">" + " <state>" + " <opaque value=\"false\"/>" + " <color type=\"BACKGROUND\" value=\"#FFE0E0\" />" + " <color type=\"FOREGROUND\" value=\"#000000\" />" + " <imagePainter method=\"checkBoxBackground\" path=\"/org/jdesktop/swingx/renderer/checkBoxBackground.png\" sourceInsets=\"5 5 5 5\" paintCenter=\"true\" stretch=\"true\" />" + " </state>" + " <state value=\"SELECTED\">" + " <color type=\"BACKGROUND\" value=\"#E0FFE0\"/>" + " <color type=\"TEXT_FOREGROUND\" value=\"#00AA00\"/>" + " </state>" + " </style>" + " <bind style=\"checkbox\" type=\"region\" key=\"Checkbox\"/>" + " <style id=\"table\">" + " <state>" + " <color type=\"BACKGROUND\" value=\"#FFFFF0\" />" + " <color type=\"FOREGROUND\" value=\"#000000\" />" + " </state>" + " <state value=\"SELECTED\">" + " <color type=\"TEXT_BACKGROUND\" value=\"#0070C0\"/>" + " <color type=\"TEXT_FOREGROUND\" value=\"#FFFFFF\"/>" + " </state>" + " </style>" + " <bind style=\"table\" type=\"region\" key=\"Table\"/>" + " <style id=\"cellRenderer\"> " + " <state>" + " <opaque value=\"true\"/>" + " </state>" + " </style>" + " <bind style=\"cellRenderer\" type=\"name\" key=\"Table.cellRenderer\"/>" + "</synth>"; public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ public void run() { try { new SynthCheckBoxPainterTest(); } catch (Exception e) { e.printStackTrace(); } } }); } public SynthCheckBoxPainterTest() throws Exception { InputStream is = new ByteArrayInputStream(synthXml.getBytes("UTF8")); SynthLookAndFeel laf = new SynthLookAndFeel(); laf.load(is, SynthCheckBoxPainterTest.class); UIManager.setLookAndFeel(laf); // optional: background image to check fix for 1513- swingx // support fully transparent renderers JXPanel panel = new JXPanel(new BorderLayout()); panel.setBackgroundPainter(new ImagePainter(XTestUtils.loadDefaultImage("moon.jpg"))); setContentPane(panel); JXTable table = new JXTable(new MyTableModel(100)); // optional: forcing a semi-transparent background onto an otherwise opaque // renderingComponent // DefaultTableRenderer renderer = (DefaultTableRenderer) table.getDefaultRenderer(Boolean.class); // ComponentProvider provider = renderer.getComponentProvider(); // provider.getDefaultVisuals().setBackground(PaintUtils.setAlpha(Color.BLUE, 100)); // apply striping table.addHighlighter(HighlighterFactory.createSimpleStriping(Color.YELLOW)); // apply swingx painter table.addHighlighter(new PainterHighlighter(HighlightPredicate.ROLLOVER_ROW, new MattePainter(PaintUtils.setAlpha(Color.RED, 100)))); // new BusyPainter())); add(new JScrollPane(table)); // optional: background image to check fix for 1513- swingx // support fully transparent renderers // set transparent // ((DefaultTableRenderer) table.getDefaultRenderer(Boolean.class)) // .getComponentProvider().getRendererComponent(null).setOpaque(false); // table.setOpaque(false); // ((JComponent) table.getParent()).setOpaque(false); // ((JComponent) table.getParent().getParent()).setOpaque(false); add(new JCheckBox("Regular CheckBox"), BorderLayout.SOUTH); setTitle("Synth table (transparent/update) rollover " + System.getProperty("java.version")); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(new Dimension(600, 400)); setLocationRelativeTo(null); setVisible(true); } private static class MyTableModel extends AbstractTableModel { private int rows; private int cols = 3; private ArrayList<Object[]> data; private Class<?>[] columns = new Class<?>[] { String.class, Boolean.class, ImageIcon.class}; public MyTableModel(int rows) { this.rows = rows; this.data = new ArrayList<Object[]>(); for (int i = 0; i < rows; i++) { Object[] row = new Object[this.cols]; this.data.add(row); row[0] = "cell " + i + ":" + 0; row[1] = new Boolean(i % 2 == 0); row[2] = createIcon(); } // for debugging: solid background in row with striping color setValueAt(false, 1, 1); } private Icon createIcon() { return new Icon() { private Color color = new Color(new Random().nextInt(0xFFFFFF)); public int getIconHeight() { return 16; } public int getIconWidth() { return 16; } public void paintIcon(Component c, Graphics g, int x, int y) { g.setColor(color); g.fillRect(x, y, getIconWidth(), getIconHeight()); } }; } @Override public Class<?> getColumnClass(int columnIndex) { return this.columns[columnIndex]; } public int getColumnCount() { return this.cols; } public int getRowCount() { return this.rows; } public Object getValueAt(int row, int col) { return this.data.get(row)[col]; } @Override public String getColumnName(int column) { return this.getColumnClass(column).getSimpleName(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex < 2; //(rowIndex % 2 == 0); } @Override public void setValueAt(Object value, int row, int col) { this.data.get(row)[col] = value; this.fireTableCellUpdated(row, col); } } }