1

TableDialogEditDemo.javaサンプルクラスを使用するこのOracleチュートリアルから学んでいます

JTable用のカスタムセルレンダラーとエディターを作成しました。

これらをこのOracleTableDialogEditDemo.javaクラスに登録します

        ...
        ...
        //Set up renderer and editor for the Favorite Color column.
        table.setDefaultRenderer(Color.class,
                                 new ColorRenderer(true));
        table.setDefaultEditor(Color.class,
                               new ColorEditor());

        TableColumn c = table.getColumnModel().getColumn(2);
        c.setCellRenderer(new CellStringRenderer()); //My custom Renderer
        c.setCellEditor(new CellStringEditor()); // My custom Editor

        //Add the scroll pane to this panel.
        add(scrollPane);
        ...
        ...

説明を更新)セルをクリックすると入力ダイアログボックスが表示されてOKです。テキストを入力して[OK]をクリックすると、JTableのセルが更新されますが、テキストが正しく表示/レンダリングされません。テキストコンテンツをセルに正しく表示するには、他のセルをクリックする必要があります。

私のコードの何が問題になっていますか?

私のレンダラー

import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class CellStringRenderer extends JLabel implements TableCellRenderer
{

    public CellStringRenderer()
    {
        this.setOpaque(true);
    }


    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
       String stringValue = (String) value;
       this.setText(stringValue);
       return this;
    }

}

マイエディター(更新

import java.awt.Component;
import javax.swing.*;
import javax.swing.table.TableCellEditor;


public class CellStringEditor extends AbstractCellEditor
        implements TableCellEditor
{

    String input;

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {
        if (isSelected)
        {
            JOptionPane dialog = new JOptionPane();
            input = dialog.showInputDialog(null, "new value");
            return dialog;   
        }
        return null;
    }

    @Override
    public Object getCellEditorValue()
    {
        return input;
    }
}
4

1 に答える 1

7

私はこの質問の著者であり、私はそれを解決しました。他の人が助けを得ることができるように、私は解決策を提供します。

JTableで使用するカスタムレンダラーとカスタムエディターを作成しようとしていました。レンダラーは、JLabelを使用してデータを表示するだけです。これはすでにJTableの標準コンポーネントです。エディタは、編集するセルをクリックすると表示されるダイアログボックスです。

解決策は次のとおりです。

変更されないままになるクラスは、Oracleの3つのクラスと私のカスタムレンダラークラスです。

1.TableDialogEditDemo.java 。_

2. ColorEditor.java

3. ColorRenderer.java

4.上記の質問本文で提供されたCellStringRendererクラス(私のクラス)

更新されるクラスはカスタムエディタークラスです(名前を「CellStringEditor」から「DialogStringEditor」に変更しました)

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class DialogStringEditor extends AbstractCellEditor
        implements TableCellEditor,
        ActionListener
{

    String newInput;
    String oldValue;
    JButton button;
    static final String EDIT = "edit";

    public DialogStringEditor()
    {
        button = new JButton();
        button.setBackground(Color.WHITE);
        button.setActionCommand(EDIT);
        button.addActionListener(this);
        button.setBorderPainted(false);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (EDIT.equals(e.getActionCommand()))
        {
            newInput = JOptionPane.showInputDialog("Edit", oldValue);
            if (newInput == null)
            {
                newInput = oldValue;
            }
            fireEditingStopped();
        }
    }

    @Override
    public Object getCellEditorValue()
    {
        return newInput;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,
            Object value,
            boolean isSelected,
            int row,
            int column)
    {
        newInput = (String) value;
        oldValue = (String) value;
        return button;
    }
}

これは問題なく動作します

また、レンダラークラス「CellStringRenderer」を少し更新して、セルの選択色と選択解除色の表示方法を制御することもできます。

このメソッドを更新します。

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        String stringValue = (String) value;
        this.setText(stringValue);

        if (isSelected)
        {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
        } else
        {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
        }

        return this;
    }
}

よろしく。

于 2013-01-05T22:13:01.067 に答える