2

問題の列がエディタとしてコンボを使用している場合、JTable選択/フォーカスされたセルをでレンダリングする必要があります。JComboBoxこれの目的は、列のセルが。ではなくコンボで編集されていることをユーザーにヒントを与えることJTextFieldです。

私の問題は、LookAndFeelsMetal以外では、テーブルの選択背景をコンボボックスに設定できないことです。ワンクリックまたはキーボードで「コンボ列」に移動すると、選択したセルがデフォルトの背景のコンボによってレンダリングされます。

Metal L&Fは私が望むように機能しますが、お客様がSubstance / Nimbus / Windows L&Fのいずれかを使用しており、いずれの場合も機能しないため、これはオプションではありません。

私が十分に明確であったことを願っています、どんな助けもありがたいです!

このSSCCEの「コンボ列」でセルを選択して、意味を確認してください。

import java.awt.Component;

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;


public class RenderSelectedCellWithComboSSCCE extends JFrame
{   
    RenderSelectedCellWithComboSSCCE()
    {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        add(new JScrollPane(createTable()));
        pack();
    }

    private JTable createTable()
    {
        TableModel model = new DefaultTableModel(
                new Object [][] {{"A", "Item 0"},
                                 {"B", "Item 1"},
                                 {"C", "Item 2"},
                                 {"D", "Item 3"},
                                 {"E", "Item 4"}},
                new String [] {"TextField", "Combo"});
        JTable table = new JTable(model);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{"Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
        editor.setClickCountToStart(2);
        table.getColumnModel().getColumn(1).setCellEditor(editor);
        table.getColumnModel().getColumn(1).setCellRenderer(new ComboCellRenderer());
        return table;
    }

    /**
     * Renderer that demonstrates problem rendering selected cells with a combo with selection background.
     */
    private static class ComboCellRenderer implements TableCellRenderer
    {
        final TableCellRenderer defaultRenderer;
        final JComboBox combo;

        ComboCellRenderer()
        {
            defaultRenderer = new DefaultTableCellRenderer();
            combo = new JComboBox();
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            if (hasFocus && table != null && table.isCellEditable(row, column))
            {
                combo.setModel(new DefaultComboBoxModel(new Object[]{value}));
                combo.setSelectedItem(value);
                combo.setBackground(table.getSelectionBackground());    // This only have desired effect for Metal L&F
                return combo;
            }
            else
            {
                return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                setLookAndFeel();
                new RenderSelectedCellWithComboSSCCE().setVisible(true);
            }

            private void setLookAndFeel()
            {
                try
                {
                    //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());       // Metal works fine
                    UIManager.setLookAndFeel(new NimbusLookAndFeel());
                    //UIManager.setLookAndFeel(new WindowsLookAndFeel());
                    //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    //UIManager.setLookAndFeel("org.jvnet.substance.SubstanceLookAndFeel");
                }
                catch (Exception e)
                {
                    throw new RuntimeException("Failed to set LookAndFeel", e);
                }
            }
        });
    }
}
4

2 に答える 2

3

ComboBoxレンダリングは問題を引き起こします。通常、LAFは、コンボ自体をどのように表示するかについて非常に特別なアイデアを持っています。多くはスタイルが設定されており、角が丸くなっています。スタニの提案で少し遊んでいる間、私はすべての厄介な(そしてすぐに忘れられた:-)詳細に遭遇しました。

  • Windowsは、コンボをレンダリングするときに不透明度をオフにするため、ここでは、スーパーを呼び出した後に不透明度をtrueに設定するレンダラーにコンボのレンダラーをラップするのに役立ちます。
  • Nimbusは、不透明度に関係なく、設定されたコンポーネントの背景を無視します。デフォルトとは異なる選択色(テーブル上)を設定した場合、レンダラーは期待どおりに機能します(大丈夫、ほぼ予期しない色の変化:-)
  • ..。

一方、完全に機能するJComboBoxは必要ありません。必要なのは、開くものがあるという視覚的な手がかりだけです。したがって、カスタムコンポーネント(最も単純なJLabelにはいくつかの矢印が付いています)を使用して、次のようなJComboBoxをモックすることができます。

public static class MockCombo extends JLabel {

    private JButton arrow;

    public MockCombo() {
        JComboBox box = new JComboBox();
        box.setEditable(true);
        arrow = (JButton) box.getComponent(0);
        setLayout(new BorderLayout());
        add(arrow, BorderLayout.LINE_END);
        setOpaque(true);
    }

}

LAFで微調整する必要がありますが、JComboBoxを微調整するよりもはるかに簡単な作業です。

于 2011-08-08T12:07:15.690 に答える
2

コンボレンダラーを指定して、そこで希望の色を使用できます。レンダリングされたコンポーネントのレンダラーの種類。

于 2011-08-08T08:56:49.937 に答える