#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 и корректно