Ich fragte this question über ein Problem, das ich mit einem CellRenderer mit dem Nimbus Look and Feel und das Problem hat sich möglicherweise mit Scala zu tun. Grundsätzlich habe ich einen Cell-Renderer, der Panel
erweitert (im Gegensatz zu DefaultTableCellRenderer
) und es verhält sich seltsam: Es ist nicht die richtige alternierende Zeile Farben, während ein gleichwertiges Java-Programm verhält sich gut. Wenn jemand interessiert ist, hier einige Scala Code auszuführen:Tabelle Cell-Renderer mit Nimbus und Scala
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
import java.awt.{Dimension, Color}
import java.lang.String
import javax.swing.table.{DefaultTableCellRenderer, AbstractTableModel, TableCellRenderer}
import javax.swing.{UIManager, JComponent, JLabel, JTable}
import swing.{Component, MainFrame, Label, BorderPanel, Panel, Table, ScrollPane, Frame, SimpleGUIApplication}
object SwingTest extends SimpleGUIApplication {
UIManager.setLookAndFeel(new NimbusLookAndFeel)
val tcr = new TCR
val dtcr = new DefaultTableCellRenderer
val t = new Table {
model = new AbstractTableModel {
def getColumnCount = 2
def getRowCount = 3
override def getColumnName(column: Int) = "Headings"
def getValueAt(rowIndex: Int, columnIndex: Int) = rowIndex match {
case 0 => "Hello"
case 1 => "World"
case 2 => "Again"
}
}
override protected def rendererComponent(isSelected: Boolean, hasFocus: Boolean, row: Int, column: Int) = {
if (column == 0)
Component.wrap(tcr.getTableCellRendererComponent(peer, model.getValueAt(row, column), isSelected, hasFocus, row, column).asInstanceOf[JComponent])
else
Component.wrap(dtcr.getTableCellRendererComponent(peer, model.getValueAt(row, column), isSelected, hasFocus, row, column).asInstanceOf[JComponent])
}
}
val top = new MainFrame {
title = "Test"
contents = new ScrollPane {
viewportView = t
}
size = new Dimension(300, 300)
}
class TCR extends BorderPanel with TableCellRenderer {
val label = new Label
label.foreground = Color.CYAN
add(label, BorderPanel.Position.Center)
def getTableCellRendererComponent(table: JTable, value: Any, isSelected: Boolean, hasFocus: Boolean, row: Int, column: Int) = {
label.text = String.valueOf(value)
if (isSelected)
background = table.getSelectionBackground
else {
println("row=%d, t_back=%s, t_alt=%s".format(row, table.getBackground, UIManager.getColor("Table.alternateRowColor")))
background = if (row % 2 == 0) UIManager.getColor("Table.alternateRowColor") else table.getBackground
}
peer
}
}
}
Wenn Sie den Code ausführen werden Sie sehen, was das Problem ist (es ist mit der zweiten Reihe Färbung in der Panel
-renderer zu tun, nicht funktioniert korrekt). Wenn Sie eine Java-Entsprechung ausführen, werden Sie sehen, dass es normal funktioniert. Hat jemand eine Idee, warum der Scala-Code nicht wie erwartet funktioniert? Hier ist das Äquivalent Java Code:
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class SwingTest {
public static class StringCellRenderer extends JPanel implements TableCellRenderer {
private JLabel l1 = new JLabel();
public StringCellRenderer() {
setLayout(new BorderLayout());
l1.setForeground(Color.CYAN);
add(l1, BorderLayout.CENTER);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
l1.setText(String.valueOf(value));
if (isSelected) {
setBackground(table.getSelectionBackground());
}
else {
if (row % 2 == 0) {
setBackground(UIManager.getColor("Table.alternateRowColor"));
} else {
setBackground(table.getBackground());
}
}
return this;
}
}
public static void main(String[] args) throws UnsupportedLookAndFeelException {
JTable t = new JTable(new AbstractTableModel() {
public int getRowCount() {
return 3;
}
public int getColumnCount() {
return 2;
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (rowIndex) {
case 0:
return "Hello";
case 1:
return "World";
case 2:
return "Again";
default:
throw new IllegalArgumentException();
}
}
@Override
public String getColumnName(int column) {
return "Headings";
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return String.class;
} else {
return Object.class;
}
}
});
t.setDefaultRenderer(String.class, new StringCellRenderer());
t.setDefaultRenderer(Object.class, new DefaultTableCellRenderer());
UIManager.setLookAndFeel(new NimbusLookAndFeel());
JFrame f = new JFrame("Test");
f.setContentPane(new JScrollPane(t));
f.setSize(300, 300);
f.pack();
f.setVisible(true);
}
}