Question

Have my implementation of JTable with modify prepareRenderer.

public class MyTable extends JTable {

    private List<Client> list;

    public MyTable(TableModel model){
        super(model);
        if (model instanceof ProfitAbilityTableModel){
            list=((ProfitAbilityTableModel)model).getClients();
        }       
    }
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex){
        Component rComp=super.prepareRenderer(renderer, rowIndex, vColIndex);
        if(list!=null){
            Client client=list.get(rowIndex);
            if(client.getExpected()==client.getReceived())
                rComp.setBackground(new Color(139, 255, 182));
            else
                rComp.setBackground(new Color(255,139,147));
        }

        return rComp;
    }
}

ProfitAbilityTableModel

public class ProfitAbilityTableModel  extends AbstractTableModel{

    private String []columnNames={"Имя учетной записи", "Ф.И.О. Клиента","Адрес",
            "Получено грн.", "Предпологалось грн."};
    private List<Client> clients;

    public ProfitAbilityTableModel(List<Client> clients){
        this.clients=clients;
    }

    public ProfitAbilityTableModel(){};

    @Override
    public int getColumnCount() {
        return 5;
    }

    @Override
    public int getRowCount() {
        return (clients!=null) ? clients.size(): 0;
    }

    @Override
    public Object getValueAt(int r, int c) {
        Client client=clients.get(r);
        switch (c) {
            case 0:
                return client.getUserName();
            case 1:
                return client.getName() +" " + client.getSurname() + " " + client.getPatronymic();
            case 2:
                return client.getAddress();
            case 3:
                return client.getReceived();
            case 4:
                return client.getExpected();    
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int c){
        return columnNames[c];
    }

    public List<Client> getClients() {
        return clients;
    }


}

In mainFrame create table with empty tableModel table = new MyTable(new ProfitAbilityTableModel());

when press button do this

button_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                table.setModel(new ProfitAbilityTableModel(ClientFactory.getClients(10)));
            }
        });

where ClientFactory:

public class ClientFactory {
    public static List<Client> getClients(int amount){
        List<Client> result=new ArrayList<>();
        Client c;
        int received,expected;
        for(int i=0;i<amount;i++){
            c=new Client();
            c.setUserName("username " + i);
            c.setName("name "+ i);
            c.setSurname("surname " + i);
            c.setPatronymic("patronymic" + i);
            c.setAddress("address " + i);
            expected=(int)(Math.random()*100);
            received=(int)(Math.random()*100);
            if(received>expected)
                received=expected;
            c.setExpected(expected);
            c.setReceived(received);
            result.add(c);
        }
        return result;
    }
}

Made this for change color of row if two fields of Client are equals. It's work fine when create MyTable, but when change tableModel all row has default background color (white). How invoke this code when change table model?

Was it helpful?

Solution

Problem solved by add to ProfitAbilityTableModel this methods:

public void setData(List<Client> clients){
        this.clients=clients;
    }

    public Client getClient(int index){
        return clients.get(index);
    }

Change my table:

public class MyTable extends JTable {

    public MyTable(TableModel model){
        super(model);   
    }
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex){
        Component rComp=super.prepareRenderer(renderer, rowIndex, vColIndex);
        if(getModel()!=null){
            Client client=((ProfitAbilityTableModel)getModel()).getClient(rowIndex);
            if(client.getExpected()==client.getReceived())
                rComp.setBackground(new Color(139, 255, 182));
            else
                rComp.setBackground(new Color(255,139,147));
        }

        return rComp;
    }
}

In main frame update data by button like this:

ProfitAbilityTableModel model=(ProfitAbilityTableModel)table.getModel();
model.setData(ClientFactory.getClients(10));
model.fireTableDataChanged();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top