[英]Changing jtable cell color after jitem click
我是Java Swing的新手。 我有一個jtable,在第2列中,當右鍵單擊一個單元格時,jpopmenu顯示帶有兩個選項(進行中/已解決)的jtable,並且我想在單擊選項“已解決”時將單元格顏色修改為綠色。 我知道我需要一個單元格渲染器。 怎么放呢?
有我的源代碼:
public class logaff {
static File font_file = new File("font/MYRIADPRO-REGULAR.ttf");
static JPopupMenu pm;
static JMenuItem one = new JMenuItem();
static JMenuItem two = new JMenuItem();
static JTable table;
public static void main(String[] args) throws FontFormatException,
IOException {
Font fontt = Font.createFont(Font.TRUETYPE_FONT, font_file);
Font sizedFont = fontt.deriveFont(Font.PLAIN, 15);
JPanel logaffich = new JPanel();
logaffich.setBackground(Color.black);
logaffich.setLayout(null);
JPanel tableau = new JPanel();
tableau.setLocation(5, 15);
tableau.setSize(790, 520);
tableau.setBackground(Color.white);
JButton a = new JButton("fg");
String[] columnNames = { "ID", "Description", "Status", "Cam",
"Elapsed Time" };
String[][] data = new String[10][5];
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
data[i][j] = "Table " + i + ", " + j;
}
}
int[] columnsWidth = { 158, 450, 60, 40, 80 };
table = new JTable(data, columnNames);
int k = 0;
for (int width : columnsWidth) {
TableColumn column = table.getColumnModel().getColumn(k++);
column.setMinWidth(width);
column.setMaxWidth(width);
column.setPreferredWidth(width);
table.setRowHeight(55);
}
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
tableau.setLayout(new BorderLayout());
tableau.add(scrollPane, BorderLayout.CENTER);
pm = new JPopupMenu();
pm.add(one);
pm.add(two);
table.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
try {
showPopup(me);
} catch (FontFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
logaffich.add(tableau);
TitledBorder title1;
title1 = BorderFactory.createTitledBorder(null, "New Log Alert",
TitledBorder.LEFT, TitledBorder.TOP, sizedFont, Color.white);
logaffich.setBorder(title1);
// panel pour le formulaire
JFrame frame = new JFrame();
frame.setContentPane(logaffich);
// Create and set up the content pane.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(808, 565);
frame.setResizable(false);
frame.setVisible(true);
}
private static void showPopup(MouseEvent me) throws FontFormatException,
IOException {
// is this event a popup trigger?
if (pm.isPopupTrigger(me)) {
Point p = me.getPoint();
final int row = table.rowAtPoint(p);
final int col = table.columnAtPoint(p);
// if we've clicked on a row in the second column
if (row != -1 && col == 1) {
File font_file = new File("font/MYRIADPRO-REGULAR.ttf");
Font fontt = Font.createFont(Font.TRUETYPE_FONT,font_file);
Font sizedFont = fontt.deriveFont(Font.BOLD, 17);
final ImageIcon progress = new ImageIcon("images/progress.png");
one.setIcon(progress);
one.setFont(sizedFont);
final ImageIcon ok = new ImageIcon("images/ok.png");
two.setIcon(ok);
two.setFont(sizedFont);
one.setText("In progress " + row + ".");
two.setText("Solved " + row + ".");
pm.show(table, p.x, p.y);
}
one.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
System.out.println("sfsdf" + row);
}
});
}
}
}
您需要閱讀有關Renderers的文檔。 為了正確使用它。
接下來的代碼將自定義單元格渲染器添加到您的列中:
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellRenderer(getRenderer());
getRenderer
方法的示例代碼:
private static TableCellRenderer getRenderer() {
return new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
boolean solved = false;
if (value.toString().endsWith("Solved")) {
solved = true;
value = value.toString().replace("Solved", "");
}
Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value,isSelected, hasFocus, row, column);
if (solved) {
tableCellRendererComponent.setBackground(Color.GREEN);
} else {
tableCellRendererComponent.setBackground(table.getBackground());
}
return tableCellRendererComponent;
}
};
}
該方法返回DefaultTableCellRenderer 。 在if-else
語句中,您可以確定單元格的背景。
編輯:1)更改了getRenderer
方法。
2)以以下方式創建彈出窗口:
pm = new JPopupMenu();
pm.add(one);
pm.add(two);
one.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if(row != -1)
System.out.println("sfsdf" + row);
}
});
two.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if(row != -1){
Object valueAt = table.getValueAt(row,1);
table.setValueAt(valueAt+"Solved", row,1);
((DefaultTableModel)table.getModel()).fireTableDataChanged();
}
}
});
因為您每次調用showPopup
方法時都添加了偵聽器,而不是像我的示例中那樣僅添加一次。 row
字段我設置為靜態字段。
3)您的方法showPopup更改了:
private static void showPopup(MouseEvent me) throws FontFormatException,
IOException {
// is this event a popup trigger?
if (pm.isPopupTrigger(me)) {
Point p = me.getPoint();
row = table.rowAtPoint(p);
final int col = table.columnAtPoint(p);
// if we've clicked on a row in the second column
if (row != -1 && col == 1) {
final ImageIcon progress = new ImageIcon("images/progress.png");
one.setIcon(progress);
final ImageIcon ok = new ImageIcon("images/ok.png");
two.setIcon(ok);
one.setText("In progress " + row + ".");
two.setText("Solved " + row + ".");
pm.show(table, p.x, p.y);
}
}
}
4)以另一種方式創建表table = new JTable(new DefaultTableModel(data, columnNames));
如果按照我的建議更改代碼,則在彈出窗口中按“已解決”時 ,單元格將帶有綠色背景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.