سؤال

انا سألت هذا السؤال حول مشكلة كنت أتعاغب مع عارض خلية باستخدام نظرة NIMBUS وشعورها، فقد تحولت المشكلة إلى أن تفعل مع Scala. في الأساس لدي عارض الخلية التي تمتد Panel (في مقابل DefaultTableCellRenderer) ويتم التصرف بطريقة الغريب: لا يجسد ألوان الصف البديل بشكل صحيح في حين برنامج جافا مكافئ يتصرف جيدا. إذا كان أي شخص مهتم، فهذا هو بعض سكالا رمز لتشغيل:

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

إذا قمت بتشغيل التعليمات البرمجية، سترى المشكلة (يجب القيام به مع تلوين الصف البديل في Panel-Renderer لا يعمل بشكل صحيح). إذا قمت بتشغيل مكافئ Java، فسترى أنه يعمل بشكل طبيعي. أي شخص لديه أي فكرة لماذا لا يعمل رمز SCALA كما هو متوقع؟ هنا هو ما يعادل جاوة الشفرة:

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);
  }
}
هل كانت مفيدة؟

المحلول

أعتقد أن هذا قد يكون خطأ (بفضل Ingo Meier. من فريق Scala Swing للمساعدة في القائمة البريدية للمستخدمين Scala). يتم تقديمه تحت Scala TRAC AS # 2292

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top