2009-08-25 10 views
3

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); 
    } 
} 

Antwort

1

Ich denke hierbei um ein Problem sein kann (dank Ingo Meier vom scala Swing-Team um Hilfe an den scala-Benutzer-Mailingliste). Es ist unter Scala Trac als # 2292

abgelegt
Verwandte Themen