Потеря цвета JTable после обновления

#java #swing #jtable

#java #качать #jtable

Вопрос:

Я создал JTable, который заполняет данные из базы данных и имеет один редактируемый столбец состояния, который имеет значение Y / N. Если значение столбца состояния равно Y, то цвет желтый, но если его изменить на N, его цвет изменится на зеленый.Проблема в том, что у него также есть кнопка обновления, и при выполнении ее действия цвет столбца состояния меняется на желтый со статусом Y. Как я могу сохранить статус N неизменным при нажатии кнопки обновления

Пожалуйста, кто-нибудь мне поможет

 import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class Arsti2 {
    JFrame main = new JFrame("Test");
    JPanel tP = new JPanel();
    JPanel bP = new JPanel();
    JButton one = new JButton("Refresh");
    JTable table = new JTable();
    DefaultTableModel model;
    Vector columnNames = new Vector();
    Vector data = new Vector();

    Arsti2() {
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setSize(840, 300);
        try {

            reloadData();
            model = new DefaultTableModel(data, columnNames);
            table.setModel(model);
            table.getColumnModel().getColumn(5).setCellRenderer(new CustomRenderer());
            tP.add(table);
            bP.add(one);
            main.add(tP, BorderLayout.NORTH);
            main.add(bP, BorderLayout.SOUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
        main.setVisible(true);
        one.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evnt1) {
                try {
                    reloadData();

                    model.fireTableDataChanged();

                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });
    }

    private void reloadData() throws ClassNotFoundException, SQLException {
        columnNames.clear();
        data.clear();
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="   "D:\filedb.accdb";
        Connection con = DriverManager.getConnection(url, "", "");
        Statement st = con.createStatement();
        ResultSet res = st.executeQuery("SELECT * FROM Filelist");
        ResultSetMetaData rsmd = res.getMetaData();
        int column = rsmd.getColumnCount();
        columnNames.addElement("serialNo");
        columnNames.addElement("location");
        columnNames.addElement("fileName");
        columnNames.addElement("lastModified");
        columnNames.addElement("size");
        columnNames.addElement("status");

        while (res.next()) {
            Vector row = new Vector(column);
            for (int i = 1; i <= column; i  ) {
                row.addElement(res.getObject(i));
            }

            row.add("Y");
            data.addElement(row);

        }
    }

    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.GREEN);
            }
            return cellComponent;
        }
    }

    public static void main(String[] args) {
        new Arsti2();
    }
}
  

Комментарии:

1. Почему вы принудительно добавляете «Y» к данным строки row.add("Y"); ? Кроме того, вы не должны вызывать new Arsti2(); напрямую из main, не проходя через поток отправки событий (EDT).

2. model.fireTableDataChanged(); сброс всех пользовательских средств визуализации / редактора, так как этот метод реализован в DefaultTableModel и корректно