我想更改JTable行的颜色。
当我在JTable中设置一行时,第一行变为RED颜色。然后当我想要添加新行时,第一行变为黄色,第二行变为红色;
我不使用重绘()Becouse重绘所有时间的工作。我只需要一次。当我使用repaint或tablemodel.setfile ...表不断更新
答案 0 :(得分:2)
可以使用custom cell renderer完成此操作。
单元格渲染器负责创建单元格实际显示的组件。 (单元格渲染器组件实际上已添加到JTable。JTable只是用它来进行绘画。)DefaultTableCellRenderer
创建JLabel,以便您可以自由设置其背景和前景色。你不需要做画。
您可以随心所欲地显示单元格。
,我不确定你希望它如何照看两行。import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
public class CustomCellRenderer implements Runnable, ActionListener {
public static void main(String[] args) {
SwingUtilities.invokeLater(new CustomCellRenderer());
}
JTable table;
@Override
public void run() {
JFrame frame = new JFrame("Custom Cell Renderer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table = new JTable(new DefaultTableModel(0, 2) {
@Override
public Class<?> getColumnClass(int c) {
return Object.class;
}
});
class RedYellowRenderer extends DefaultTableCellRenderer {
RedYellowRenderer() {
setHorizontalAlignment(CENTER);
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column
) {
Component c = super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column
);
if(row == 0 && table.getRowCount() > 1) {
c.setBackground(Color.YELLOW);
c.setForeground(Color.BLACK);
} else {
c.setBackground(Color.RED);
c.setForeground(Color.WHITE);
}
return c;
}
}
table.setDefaultRenderer(Object.class, new RedYellowRenderer());
table.setTableHeader(null);
JButton btn = new JButton("Add Row");
btn.addActionListener(this);
JToolBar bar = new JToolBar();
bar.setFloatable(false);
bar.add(btn);
JPanel content = new JPanel(new BorderLayout());
content.add(bar, BorderLayout.NORTH);
content.add(new JScrollPane(table), BorderLayout.CENTER);
frame.setContentPane(content);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent ae) {
int nextRow = table.getRowCount();
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.addRow(new Object[] { "NAME" + nextRow, "SPORT" + nextRow });
}
}