4

他の列の内容に応じて、テーブルを作成し、特定のセルに黄色、赤、または白の色を付けようとしています。そのために、値を入力してから内容を確認する行をループしています。これは、現在画面に表示されているすべての行で問題なく機能しますが、プログラムが表示されていない行に到達した場合、またはユーザーがすべてのセルをスクロールしようとすると、背景色が白に戻ります。私は解決策をWebで検索しましたが、妥当と思われる唯一のアイデアは、各ループの後にcellRendererをリセットすることでした。これは、すべてのセルもリセットするため、機能しません。

誰かがこれに対する解決策を知っているか、私が何かを見逃している場所について私にアイデアを与えることができることを願っています。

私はこのループを使用しています

for(int e = 0; e < modules.size(); e++)
    {
    gui.clearOutputStream();
    gui.getOutputStream().setText("Load Modul " + modules.get(e) + "\r\n");
    version = getVersion(modules.get(e));

    //Update current Row
    updateRow(gui.getReleaseTabelle(), e);
    }

このメソッドを呼び出す

public void updateRow(JTable target, int row){
//...
//insert Values here
//...
CustomRenderer cr = new CustomRenderer();
        cr.tab = target;
        if(!target.getValueAt(row, 2).equals(target.getValueAt(row, 3)))
        {
            cr.Val1 = target.getValueAt(row, 1).toString();
            target.setValueAt("X", row, 1);
        }
        else if(!target.getValueAt(row, 7).equals(""))
        {
            cr.Val1 = target.getValueAt(row, 1).toString();
            target.setValueAt("Y", row, 1);
        }
        else
        {

        }
        target.getColumnModel().getColumn(1).setCellRenderer(cr);

}

これは私のCustomRendererです

class CustomRenderer extends DefaultTableCellRenderer 
    {
private static final long serialVersionUID = 6703872492730589499L;
        public String Val1; 
        public JTable tab;

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            if(tab.getValueAt(row, 1).equals("Y")){
                cell.setBackground(new java.awt.Color(255, 255, 0));
                tab.setValueAt(Val1, row, 1);
            }
            else if(tab.getValueAt(row, 1).equals("X")){
                cell.setBackground(new java.awt.Color(255, 50, 50));
                tab.setValueAt(Val1, row, 1);
            }
            else
            {
                //do nothing
            }
            return cell;
        }
    }
4

1 に答える 1

8

Do not update table data in your CutomRenderer class.Rendererクラスで状態を確認し、セルに色を付ける必要があります。私はあなたのCustomRendererクラスを使用し、セルに存在するデータに基づいてセルをレンダリングしました。セルのデータが「Y」の場合、黄色に色付けします。データが「N」の場合は、グレーに色付けします。

JTable でのレンダリング

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class ColoringCells {

    private static Object[] columnName = {"Yes", "No"};
    private static Object[][] data = {
            {"Y", "N"},
            {"N", "Y"},
            {"Y", "N"}
    };


    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {

                JFrame frame = new JFrame();
                JTable table = new JTable(data, columnName);
                table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
                table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer());

                frame.add(new JScrollPane(table));
                frame.setTitle("Rendering in JTable");
                frame.pack();
                frame.setVisible(true);
            }
        };

        EventQueue.invokeLater(r);
    }
}


class CustomRenderer extends DefaultTableCellRenderer 
{
private static final long serialVersionUID = 6703872492730589499L;

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if(table.getValueAt(row, column).equals("Y")){
            cellComponent.setBackground(Color.YELLOW);
        } else if(table.getValueAt(row, column).equals("N")){
            cellComponent.setBackground(Color.GRAY);
        }
        return cellComponent;
    }
}
于 2013-01-28T15:42:43.303 に答える