oyaha - set windows style java
Custom TableCellRenderer ignorado por Look & Feel (2)
Tengo una JTable para la que he proporcionado un TableCellRenderer personalizado que colorea celdas numéricas en rojo / gris / verde dependiendo de su valor (<0, 0,> 0).
Sin embargo, cuando uso Nimbus L & F, se ignora el método label.setForeground()
: cuando llamo a label.getForeground()
puedo ver que el número tiene el color correcto, por ejemplo rojo, pero en la pantalla viene en negro. Si elimino el L & F, funciona bien.
¿Hay alguna manera de pedir suavemente a L & F que acepte usar mi color para esa celda?
ps: Sé que el javadoc de setForeground()
es claro sobre el hecho de que L & F puede ignorar la llamada, entonces estoy buscando una solución alternativa.
Ok, gracias a la respuesta de mKorbel , me di cuenta de que estaba usando ColorUIResource
lugar de Color
. En otras palabras:
label.setForeground(Color.red); //works
label.setForeground(new ColorUIResource(Color.red)); //doesn''t work
No estoy seguro de entender por qué funciona uno y no el otro (el Color
es la superclase directa de ColorUIResource
), pero el problema está resuelto.
Creo que es complicado usar
JLabel
,si usará
Components
entonces no es necesario anularNimbusDefaults
oPainter
,lo siento, no tengo ninguna idea para jugar con
Nimbus
&NimbusDefaults
&Renderer
, porque tengo otro L & F favorito por favor lea más información sobre Look and Feels(sin anular NimbusDefaults desde JCheckBox, este problema se resuelve un par de veces en este foro)
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class TablePrepareRenderer extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TablePrepareRenderer() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
/*@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Integer.class;
case 3:
return Double.class;
default:
return Boolean.class;
}
}*/
};
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);
int firstRow = 0;
int lastRow = table.getRowCount() - 1;
if (row == lastRow) {
((JComponent) c).setBackground(Color.red);
} else if (row == firstRow) {
((JComponent) c).setBackground(Color.blue);
} else {
((JComponent) c).setBackground(table.getBackground());
}
return c;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
/*private static String[] suffix = new String[]{"", "k", "m", "b", "t"};
private static int MAX_LENGTH = 4;
private static String format(double number) {
String r = new DecimalFormat("##0E0").format(number);
r = r.replaceAll("E[0-9]", suffix[Character.getNumericValue(r.charAt(r.length() - 1)) / 3]);
return r.length() > MAX_LENGTH ? r.replaceAll("//.[0-9]+", "") : r;
}*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception fail) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TablePrepareRenderer frame = new TablePrepareRenderer();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
/*long[] numbers = new long[]{1000, 5821, 10500, 101800, 2000000, 7800000, 92150000, 123200000, 99999900};
for (long number : numbers) {
System.out.println(number + " = " + format(number));
}*/
}
}