Как нарисовать определенный столбец разными цветами в JTable? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть JTable, и я хочу нарисовать столбец разными цветами в зависимости от значения ячейки.Чтобы сделать это, я пытаюсь создать «TableCellRender», но не могу заставить его работать, значения кажутся скрытыми после «setDefaultRenderer».

Как я могу это сделать?

пытаюсь

TableModel

public class PartidasTableModel extends AbstractTableModel{
    private List<Partida> lista;
    private String[] colunas = {"Data ", "Casa x Visitante ", "Banca Inicial ", "Banca Final ", "Saldo ",  "Green/Red "};
    private ControlaDatas cDatas = new ControlaDatas(); 


    public PartidasTableModel(){
       this.lista = new ArrayList<Partida>();
    }

    public PartidasTableModel(List<Partida> lista){
        this();
        this.lista.addAll(lista);
    }

    @Override
    public int getRowCount() {
        return this.lista.size();
    }

    @Override
    public int getColumnCount() {
        return this.colunas.length;
    }

    //private String[] colunas = {"Data ", "Casa x Visitante ", "Banca Inicial ", "Banca Final ", "Saldo ",  "Green/Red "};
    public String getColumnName(int column){
        if(colunas[column] == "Data "){
            return "Data ";
        }else if(colunas[column] == "Casa x Visitante "){
            return "Casa x Visitante ";
        }else if(colunas[column] == "Banca Inicial "){
            return "Banca Inicial ";
        }else if(colunas[column] == "Banca Final "){
            return "Banca Final ";
        }else if(colunas[column] == "Saldo "){
            return "Saldo ";
        }else if(colunas[column] == "Green/Red "){
            return "Green/Red ";
        }
        return "";
    }

    //private String[] colunas = {"Data ", "Casa x Visitante ", "Banca Inicial ", "Banca Final ", "Saldo ",  "Green/Red "};
    public Class getColumnClass(int column){
        if(colunas[column] == "Data "){
            return String.class;
        }if(colunas[column] == "Casa x Visitante "){
            return String.class;
        }else if(colunas[column] == "Banca Inicial "){
            return String.class;
        }else if(colunas[column] == "Banca Final "){
            return String.class;
        }else if(colunas[column] == "Saldo "){
            return String.class;
        }else if(colunas[column] == "Green/Red "){
            return String.class;
        }
        return String.class;
    }

    //private String[] colunas = {"Conta ", "Vencto. ", "Capital R$ ", "Juros R$ "};
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Partida e = (Partida)lista.get(rowIndex);
        switch(columnIndex){
            case 0: return cDatas.getDataFormatada(e.getDtLancamento());
            case 1: return e.getTimeCasa() + " x " + e.getTimeVisitante();
            case 2: return FormataValorMonetario.getValorFormatado(e.getValorInicialBanca()); 
            case 3: return FormataValorMonetario.getValorFormatado(e.getValorFinalBanca()); 
            case 4: return FormataValorMonetario.getValorFormatado(e.getSaldo());  
            case 5: return isGreenOrRed(e.getGreenRed());
            default: return new String();
        }
    }

    private String isGreenOrRed(int value){
        if(value == 1){
            return "GREEN";
        }
        if (value == 2){
            return "RED";
        }
        return "";
    }

    /** retorna o objeto */
    public Partida getObject(int row){
        return lista.get(row);
    }

    /** remove registro da tabela */
    public void removeRow(int row){
        this.lista.remove(row);
        fireTableDataChanged();
    }

    /** altera a tabela */
    public void changeTabela(List<Partida> novaLista){
        this.lista = novaLista;
        fireTableDataChanged();
    }

}

TableCellRenderer

public class PartidaCustomRenderer implements TableCellRenderer{
    private JLabel label;

    public PartidaCustomRenderer() {
        label = new JLabel();
        label.setOpaque(true);
    }



    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        Object obj = table.getValueAt(row, 5);//
        String redGreen = (String)obj;
        //pinta red/green        
        if(column == 5 && redGreen == "RED"){                      
            label.setBackground(Color.red);
        }else if(column == 5 && redGreen == "GREEN"){
            label.setBackground(Color.green);
        }



        return label;
    }

    private int getAlinhamento(int coluna){
        switch (coluna) {  
           case 0:  
               return SwingConstants.CENTER;  
           case 1:  
               return SwingConstants.LEFT;  
           case 2:  
           default:  
               return SwingConstants.RIGHT;  
       }  
    }
}

Использование

public class ViewPartidas extends javax.swing.JDialog {
    private PartidaDAO dao = new PartidaDAO();
    private List<Partida> lista = new ArrayList<Partida>();
    private PartidasTableModel model;

    public ViewPartidas(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        init();
    }

     private void init(){
        //table  
        lista = dao.findAll(Partida.FIND_ALL, Partida.class);
        model = new PartidasTableModel(lista);
        tabela.setModel(model); 
        tabela.setDefaultRenderer(Object.class, new PartidaCustomRenderer());
        tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tabela.setAutoCreateColumnsFromModel(false); 
        tabela.getTableHeader().setFont(new Font("Tahoma" , Font.BOLD, 11));
        tabela.getTableHeader().setReorderingAllowed(false);  
        tabela.setFont(new Font("Tahoma", Font.BOLD, 10));

    }

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Из этого урока:

https://tips4java.wordpress.com/2010/01/24/table-row-rendering/

Мы получаем этот код:

JTable table = new JTable( model ) {
  public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component c = super.prepareRenderer(renderer, row, column);

    //  Alternate row color
    if (!isRowSelected(row)) {
      c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);
    }
    return c;
  }
};

Который должен легко адаптироваться к столбцам вместо строк иликонкретный столбец вместо чередующихся столбцов.

Итак, чтобы разбить это, вы создаете свой собственный подкласс JTable, а затем переопределяете метод prepareRenderer.Вы по-прежнему делегируете реализацию суперкласса, но затем берете предоставленный ему компонент и вносите конкретные изменения на основе строки и столбца.

0 голосов
/ 07 июня 2018

Поскольку ваш рендерер теперь выступает в качестве рендера по умолчанию для всех столбцов, вам также необходимо учитывать, как с ними обращаться ...

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

    Object obj = table.getValueAt(row, 5);//
    String redGreen = (String)obj;
    //pinta red/green        
    if(column == 5 && redGreen == "RED"){                      
        label.setBackground(Color.red);
    }else if(column == 5 && redGreen == "GREEN"){
        label.setBackground(Color.green);
    }
    // No default fall through functionality
    // for the other columns


    return label;
}

Этого сложно достичь успешно.Лучшим решением было бы установить рендер для столбца, на котором вы хотите его использовать ...

tabela.getColumnModel().getColumn(5).setCellRenderer(new PartidaCustomRenderer());

Я бы также рекомендовал использовать DefaultTableCellRenderer, так как он оптимизирован для JTable и основан наJLabel

public class PartidaCustomRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);

        String text = (String)value;
        if (column == 5 && text.equals("RED")) {
            setBackground(Color.red);
        } else if (column == 5 && text.equals("GREEN")) {
            setBackground(Color.green);
        }

        return this;
    }

    private int getAlinhamento(int coluna) {
        switch (coluna) {
            case 0:
                return SwingConstants.CENTER;
            case 1:
                return SwingConstants.LEFT;
            case 2:
            default:
                return SwingConstants.RIGHT;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...