Frage

Ich habe diese Frage über ein Problem ich war seing mit einem CellRenderers mit dem Nimbus Look and Feel und das Problem möglicherweise mit Scala zu tun zu sein hat sich herausgestellt. Im Prinzip habe ich eine CellRenderers die Panel erstreckt (im Gegensatz zu DefaultTableCellRenderer Gegensatz) und es verhält sich seltsam: Es ist nicht die alternative Zeilenfarben-Rendering richtig während ein Äquivalent Java-Programm verhält sich einfach gut. Wenn jemand interessiert ist, hier einige Scala Code auszuführen:

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 in dem Panel-Renderer Färbung zu tun, arbeitet nicht richtig). Wenn Sie einen Java-Äquivalent ausführen, werden Sie sehen, dass es normal funktioniert. Jemand eine Idee, warum der Scala-Code funktioniert nicht wie erwartet? 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);
  }
}
War es hilfreich?

Lösung

Ich denke, das ein Fehler sein kann (dank Ingo Meier von dem scala Swing-Team um Hilfe an dem scala-Benutzer-Mailingliste). Es ist unter scala trac eingereicht als # 2292

scroll top