2009-08-25 4 views
3

J'ai demandé this question à propos d'un problème que je rencontrais avec un rendu de cellule utilisant l'aspect Nimbus et le problème est peut-être lié à Scala. Fondamentalement, j'ai un rendu de cellule qui s'étend Panel (par opposition à DefaultTableCellRenderer) et il se comporte bizarrement: il ne rend pas les couleurs de rangée alternées correctement alors un programme Java équivalent se comporte très bien. Si quelqu'un est intéressé, voici un code Scala pour exécuter:Table Render renderer utilisant Nimbus et 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 
    } 
    } 
} 

Si vous exécutez le code, vous verrez ce que le problème est (il est à voir avec la ligne alternative coloration dans le Panel -renderer ne fonctionne pas correctement). Si vous exécutez un équivalent Java, vous verrez que cela fonctionne normalement. Quelqu'un at-il une idée de la raison pour laquelle le code Scala ne fonctionne pas comme prévu? Voici l'équivalent code 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); 
    } 
} 

Répondre

1

Je pense que cela peut être un bug (grâce à Ingo Meier de l'équipe de swing scala pour aider les utilisateurs scala liste de diffusion). Il est classé sous scala trac comme # 2292