使用Nimbus和Scala的表格单元渲染器
我问了一个关于使用Nimbus外观的单元渲染器的问题,这个问题可能与Scala有关。基本上,我有一个单元格渲染器,它扩展了使用Nimbus和Scala的表格单元渲染器,scala,look-and-feel,nimbus,tablecellrenderer,Scala,Look And Feel,Nimbus,Tablecellrenderer,我问了一个关于使用Nimbus外观的单元渲染器的问题,这个问题可能与Scala有关。基本上,我有一个单元格渲染器,它扩展了面板(与DefaultTableCellRenderer)相反,它的行为很奇怪:它没有正确地渲染交替的行颜色,而一个等价的Java程序却表现得很好。如果有人感兴趣,下面是一些要运行的Scala代码: import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel import java.awt.{Dimension, Color
面板
(与DefaultTableCellRenderer
)相反,它的行为很奇怪:它没有正确地渲染交替的行颜色,而一个等价的Java程序却表现得很好。如果有人感兴趣,下面是一些要运行的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
}
}
}
如果运行代码,您将看到问题所在(这与面板
-渲染器工作不正常中的替代行颜色有关)。如果运行Java等效程序,您将看到它工作正常。有人知道Scala代码为什么不能按预期工作吗?下面是等效的Java代码:
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);
}
}
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
导入javax.swing.*;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableCellRenderer;
导入javax.swing.table.DefaultTableCellRenderer;
导入java.awt.*;
公开课摇摆测试{
公共静态类StringCellRenderer扩展了JPanel实现了TableCellRenderer{
私有JLabel l1=新JLabel();
公共字符串渲染器(){
setLayout(新的BorderLayout());
l1.设置前景(颜色为青色);
添加(l1,BorderLayout.CENTER);
}
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
l1.setText(String.valueOf(value));
如果(当选){
挫折背景(table.getSelectionBackground());
}
否则{
如果(第%2行==0){
挫折背景(UIManager.getColor(“Table.alternateRowColor”);
}否则{
挫折背景(table.getBackground());
}
}
归还这个;
}
}
公共静态void main(字符串[]args)抛出不受支持的LookandFeelException{
JTable t=新的JTable(新的AbstractTableModel(){
public int getRowCount(){
返回3;
}
public int getColumnCount(){
返回2;
}
公共对象getValueAt(int行索引、int列索引){
开关(行索引){
案例0:
回复“你好”;
案例1:
回归“世界”;
案例2:
返回“再次”;
违约:
抛出新的IllegalArgumentException();
}
}
@凌驾
公共字符串getColumnName(int列){
返回“标题”;
}
@凌驾
公共类getColumnClass(int columnIndex){
如果(columnIndex==0){
返回字符串.class;
}否则{
返回Object.class;
}
}
});
t、 setDefaultRenderer(String.class,新的StringCellRenderer());
t、 setDefaultRenderer(Object.class,新的DefaultTableCellRenderer());
setLookAndFeel(新的NimbusLookAndFeel());
JFrame f=新JFrame(“测试”);
f、 setContentPane(新的JScrollPane(t));
f、 设置大小(300300);
f、 包装();
f、 setVisible(真);
}
}
我认为这可能是一个bug(感谢scala swing团队的Ingo Meier在scala用户邮件列表中提供的帮助)。它在scala trac下归档为#2292