我想更改JTable的單元格背景顏色並希望從MySQL數據庫獲取數據。動態更改JTable單元格的背景顏色
我在使用一個數據表在MySQL中有一個狀態字段。如果狀態是1,那麼單元格背景顏色應該是紅色的,如果狀態爲0,則它應該變成紅色。
我想更改JTable的單元格背景顏色並希望從MySQL數據庫獲取數據。動態更改JTable單元格的背景顏色
我在使用一個數據表在MySQL中有一個狀態字段。如果狀態是1,那麼單元格背景顏色應該是紅色的,如果狀態爲0,則它應該變成紅色。
//This is the code which I have used to change jtable cell background color dynamically
[green color indicates empty(free) cell and red color indicates occupied cells][1]
int row, col, row1, column;
TableCellRenderer renderer;
private static final int STATUS_COL = 1;
String host = "jdbc:mysql://localhost/your_database";
String username = "root";
String password = "";
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection(host, username, password);
stmt = connect.createStatement();
String sql = "your query";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
Object[][] data = new Object[10][2];
DefaultTableModel model = new DefaultTableModel(data, col);
jTable1.setModel(DbUtils.resultSetToTableModel(rs));
rs = stmt.executeQuery(sql);
int rowCnt = 0;
try{
rs = stmt.executeQuery(sql);
if(rs.last()){
rowCnt = rs.getRow();
}
} catch (Exception e){
System.out.println("Error getting row count");
e.printStackTrace();
}
int nCol = rs.getMetaData().getColumnCount();
List<String[]> table = new ArrayList<>();
String[] row = new String[nCol];
for(int l=1; l<rowCnt; l++)
{
for (int iCol = 1; iCol <= nCol; iCol++) {
Object obj = rs.getObject(iCol);
row[iCol - 1] = (obj == null) ? null : obj.toString();
jTable1.setDefaultRenderer(Object.class, new EntryCellRender());
}
table.add(row);
}
} catch (Exception e) {
System.out.println(e);
}
}
public class EntryCellRender extends DefaultTableCellRenderer {
private final Color alt2 = Color.RED;
private final Color alt1 = Color.GREEN;
private final Color invalidStatus = Color.RED;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component cr = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ("".equals(table.getValueAt(row, col))) {
setBackground(alt1);
} else {
setBackground(alt2);
}
return cr;
}
private Color colorAlternator(int row) {
if ((row % 2) == 0) {
return alt1;
} else {
return alt2;
}
}
}
enter code here
[1]: https://i.stack.imgur.com/Fi4LF.png
感謝您的支持。 – Manohar
id建議自定義單元格渲染器來實現您想要的效果。
public class CellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (column == /*your column number goes here*/) {
this.setValue(table.getValueAt(row, column));
this.setBackground(Color.RED);
}
return this;
}
}
你設置顏色之前,你可以檢查其0或1,然後改變顏色的值,如果它是你想
我如何創建和填充/填充一個JTable從數據數據庫:
表:
private void createTable(Container pane) {
Object[] namen = { "Datum", "Kategorie", "Essen", "Preise Intern", "Preise Extern" };
model = new DefaultTableModel(namen, 0);
table = new JTable(model) {
public boolean isCellEditable(int x, int y) {
return false;
}
};
Dimension minimumSize = new Dimension(1000, 500);
table.setPreferredScrollableViewportSize(minimumSize);
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model);
table.setRowSorter(sorter);
sorter.setComparator(3, Sorter.getComparator());
sorter.setComparator(4, Sorter.getComparator());
table.getColumnModel().getColumn(3).setCellRenderer(new CellRenderer()); //custom cell renderer
table.getColumnModel().getColumn(4).setCellRenderer(new CellRenderer()); //custom cell renderer
JScrollPane sp = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
,我該如何填補它:
void refreshTableContent(Vector<Gericht> v) {
for (int i = table.getRowCount() - 1; i >= 0; i--) {
model.removeRow(i);
}
fillTable(v);
}
void fillTable(Vector<Gericht> v) {
for (int i = 0; i < v.size(); i++) {
Gericht g = v.get(i);
Vector<Object> vhelp = new Vector<>();
vhelp.add(df.format(g.getDate()));
vhelp.add(g.getClassification());
vhelp.add(g.getName());
vhelp.add(g.getPreisIntern());
vhelp.add(g.getPreisExtern());
model.addRow(vhelp);
}
}
model
是您在其上添加和刪除數據的DefaultTableModel
。在每次填充時,我首先刪除所有行,然後添加新的行。這可能不是最好的解決方案,但它的工作
該模型是在這種情況下,有幾個領域的一餐。所以我創建了一個我自己的對象的矢量,然後創建一個幫助矢量,並將一餐的值存儲在其中。然後我將向量作爲行添加到JTable,下一餐被存儲在幫助向量中。
我希望你能理解我在這裏所做
由於XtremeBaumer提示,自定義單元格渲染器是爲了實現你想要的標準方法。請記住,只有一個(1)單元格渲染器類的實例被創建並用於渲染所有JTable單元格。
祝你好運!
嗨,大家好!...最後,我可以設法完成我的任務。 – Manohar
所以基本上你想它一直是紅色的? – XtremeBaumer
嗨!一般來說,爲了讓人們在應用程序的上下文中以合理的方式正確回答您的問題,我們需要從您的代碼中看到一些相關的代碼片段,目前的形式我們無法真正告訴您有關如何將此問題從「使用if語句」或類似的東西中解決。 – zack6849
所以基本上你想讓我們搜索。有關於如何改進JTable的設計的很好的教程。這可能是一個好的開始,如果這不起作用,請返回一些代碼。 – AxelH