Java JTable为所有单元格着色,而不仅仅是特定单元格
我有一个问题,一个方法应该改变一个特定单元格的颜色,但是所有单元格都会改变颜色 这是我试图实现的方法:Java JTable为所有单元格着色,而不仅仅是特定单元格,java,swing,jtable,background-color,tablecellrenderer,Java,Swing,Jtable,Background Color,Tablecellrenderer,我有一个问题,一个方法应该改变一个特定单元格的颜色,但是所有单元格都会改变颜色 这是我试图实现的方法: public Component cellBG(JTable table, int row, int column) { TableCellRenderer renderer = table.getCellRenderer(row, column); Component c = table.prepareRenderer(renderer, row, column);
public Component cellBG(JTable table, int row, int column)
{
TableCellRenderer renderer = table.getCellRenderer(row, column);
Component c = table.prepareRenderer(renderer, row, column);
Object steak = table.getValueAt(row,column);
if(((String) steak).startsWith("+"))
{
c.setBackground(Color.GREEN);
}
else if(((String) steak).startsWith("-"))
{
c.setBackground(Color.RED);
}
else if(((String) steak).startsWith("~"))
{
c.setBackground(Color.YELLOW);
}
else if(((String) steak).equals(""))
{
c.setBackground(Color.WHITE);
}
return c;
}
我的表格包含10列8行,所有行都包含+、-、~、或“”,这将导致不同颜色的分散图案,但表格在读取的最后一个entri中为实心
SSCCE中每个请求的Ass
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JFrame;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
public class ptf_viewer extends JFrame {
static JTable table;
static DefaultTableModel model;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ptf_viewer frame = new ptf_viewer();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ptf_viewer(){
getContentPane().setBackground(Color.WHITE);
setTitle("Portable test file viewing");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 1024, 768);
getContentPane().setLayout(null);
final String[] columnNames = {"Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"};
final Object[][] data = {
{"+","+","","","","~","","","",""},
{"-","+","","","","","","","",""},
{"+","+","","","~","","","","",""},
{"+","+","","","","","~","","",""},
{"+","-","","~","","","","","",""},
{"+","-","","","","","","","",""},
{"+","-","","","","","","","",""},
{"-","+","~","","","","","","","+"}
};
model = new DefaultTableModel(data, columnNames);
table = new JTable(data, columnNames);
table.setModel(model);
for(int i = 0 ; i < 8 ; i++){
cellBG(table, i, 9);
}
JTableHeader header = table.getTableHeader();
header.setFont(new Font("Times New Roman", Font.BOLD, 13));
header.setBackground(Color.black);
header.setForeground(Color.white);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setSize(988, 618);
scrollPane.setFont(new Font("Times New Roman", Font.BOLD, 13));
scrollPane.setLocation(10, 60);
getContentPane().add(scrollPane);
}
public Component cellBG(JTable table, int row, int column)
{
TableCellRenderer renderer = table.getCellRenderer(row, column);
Component c = table.prepareRenderer(renderer, row, column);
Object bøf = table.getValueAt(row,column);
if(((String) bøf).startsWith("+"))
{
c.setBackground(Color.GREEN);
}
else if(((String) bøf).startsWith("-"))
{
c.setBackground(Color.RED);
}
else if(((String) bøf).startsWith("~"))
{
c.setBackground(Color.YELLOW);
}
else if(((String) bøf).equals(""))
{
c.setBackground(Color.WHITE);
}
return c;
}
}
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.Color;
导入java.awt.Font;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JFrame;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.JTableHeader;
导入javax.swing.table.TableCellRenderer;
公共类ptf_查看器扩展JFrame{
静态JTable表;
静态模型;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
ptf_查看器框架=新的ptf_查看器();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共ptf_查看器(){
getContentPane().setBackground(颜色为.WHITE);
setTitle(“便携式测试文件查看”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(50,501024768);
getContentPane().setLayout(null);
最终字符串[]列名={“测试1”、“测试2”、“测试3”、“测试4”、“测试5”、“测试6”、“测试7”、“测试8”、“测试9”、“测试10”};
最终对象[][]数据={
{"+","+","","","","~","","","",""},
{"-","+","","","","","","","",""},
{"+","+","","","~","","","","",""},
{"+","+","","","","","~","","",""},
{"+","-","","~","","","","","",""},
{"+","-","","","","","","","",""},
{"+","-","","","","","","","",""},
{"-","+","~","","","","","","","+"}
};
模型=新的DefaultTableModel(数据、列名称);
表=新的JTable(数据、列名称);
表2.setModel(model);
对于(int i=0;i<8;i++){
cellBG(表一,9);
}
JTableHeader=table.getTableHeader();
header.setFont(新字体(“Times new Roman”,Font.BOLD,13));
标题.立根背景(颜色.黑色);
标题。设置前景(颜色。白色);
JScrollPane scrollPane=新的JScrollPane(表);
滚动窗格。设置大小(988618);
setFont(新字体(“Times new Roman”,Font.BOLD,13));
滚动窗格。设置位置(10,60);
getContentPane().add(滚动窗格);
}
公共组件cellBG(JTable表、int行、int列)
{
TableCellRenderer=table.getCellRenderer(行、列);
组件c=table.prepareRenderer(呈现器、行、列);
Object bøf=table.getValueAt(行、列);
if((字符串)bøf).startsWith(“+”)
{
c、 挫折背景(颜色:绿色);
}
else if(((字符串)bøf).startsWith(“-”)
{
c、 挫折地面(颜色:红色);
}
else if((字符串)bøf).startsWith(“~”)
{
c、 挫折地面(颜色:黄色);
}
else if(((字符串)bøf).equals(“”)
{
c、 挫折地面(颜色:白色);
}
返回c;
}
}
您需要创建自己的单元格渲染器,并让它根据单元格中包含的文本返回正确的背景色
public class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Color getBackground() {
String steak = getText();
if (steak.startsWith("+")) {
return Color.GREEN;
} else if (steak.startsWith("-")) {
return Color.RED;
} else if (steak.startsWith("~")) {
return Color.YELLOW;
} else if (steak.equals("")) {
return Color.WHITE;
}
return super.getBackground();
}
}
}
确保你的桌子使用它
table.setDefaultRenderer(String.class, new MyTableCellRenderer());
这里假设所有单元格的类型都是String
在SSCCE之后编辑:
类是Obejct
而不是String
,请使用
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
您需要创建自己的单元格渲染器,并根据单元格中包含的文本使其返回正确的背景色
public class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Color getBackground() {
String steak = getText();
if (steak.startsWith("+")) {
return Color.GREEN;
} else if (steak.startsWith("-")) {
return Color.RED;
} else if (steak.startsWith("~")) {
return Color.YELLOW;
} else if (steak.equals("")) {
return Color.WHITE;
}
return super.getBackground();
}
}
}
确保你的桌子使用它
table.setDefaultRenderer(String.class, new MyTableCellRenderer());
这里假设所有单元格的类型都是String
在SSCCE之后编辑:
类是Obejct
而不是String
,请使用
table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
abbisDK写道,SSCE提出并补充了问题
- 使用
和DefaultTableCellRenderer
查看(Strin.equals()或String.startWith是另一种非常简单的方法)Pattern.compile
- 同样,因此非常相似的代码可用于
prepareRenderer
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
public class Ptf_Viewer {
private JFrame frame = new JFrame("Portable test file viewing");
private JTable table;
private final String[] columnNames = {"Test 1", "Test 2", "Test 3", "Test 4",
"Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"};
private final Object[][] data = {
{"+", "+", "", "", "", "~", "", "", "", ""},
{"-", "+", "", "", "", "", "", "", "", ""},
{"+", "+", "", "", "~", "", "", "", "", ""},
{"+", "+", "", "", "", "", "~", "", "", ""},
{"+", "-", "", "~", "", "", "", "", "", ""},
{"+", "-", "", "", "", "", "", "", "", ""},
{"+", "-", "", "", "", "", "", "", "", ""},
{"-", "+", "~", "", "", "", "", "", "", "+"}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames);
public Ptf_Viewer() {
table = new JTable(data, columnNames) {
//logics place for prepareRenderer
};
table.setModel(model);
table.setPreferredScrollableViewportSize(
new Dimension(800, table.getPreferredSize().height));
JTableHeader header = table.getTableHeader();
header.setFont(new Font("Times New Roman", Font.BOLD, 13));
header.setBackground(Color.black);
header.setForeground(Color.white);
for (int i = 0; i < table.getColumnCount(); i++) {
RowColorRenderer rowRenderer = new RowColorRenderer(i);
TableColumn column = table.getColumnModel().getColumn(i);
column.setCellRenderer(rowRenderer);
}
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setFont(new Font("Times New Roman", Font.BOLD, 13));
frame.add(scrollPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(50, 50);
frame.pack();
frame.setVisible(true);
}
private class RowColorRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
private int colNo = 0;
RowColorRenderer(int col) {
colNo = col;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component comp = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
JComponent jc = (JComponent) comp;
if (!isSelected) {
if (table.getValueAt(row, colNo) != null) {
String str = table.getValueAt(row, colNo).toString();
if (!str.isEmpty()) {
if ((Pattern.compile("[+]").matcher(str).find())) {
setForeground(Color.magenta);
setBackground(Color.GREEN);
setFont(new Font("Serif", Font.BOLD, 16));
setHorizontalAlignment(CENTER);
} else if ((Pattern.compile("[-]").matcher(str).find())) {
setForeground(Color.blue);
setBackground(Color.RED);
setFont(new Font("Serif", Font.BOLD, 16));
setHorizontalAlignment(CENTER);
} else if ((Pattern.compile("[~]").matcher(str).find())) {
setForeground(Color.red);
setBackground(Color.YELLOW);
setFont(new Font("Serif", Font.BOLD, 16));
setHorizontalAlignment(CENTER);
} else {
setBackground(Color.WHITE);
setForeground(table.getForeground());
setFont(new Font("Serif", Font.PLAIN, 12));
setHorizontalAlignment(CENTER);
}
} else {
setBackground(Color.WHITE);
setForeground(table.getForeground());
}
}
}
return this;
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Ptf_Viewer frame = new Ptf_Viewer();
}
});
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Font;
导入java.util.regex.Pattern;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableCellRenderer;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.JTableHeader;
导入javax.swing.table.TableColumn;
公共类Ptf_查看器{
私有JFrame=新JFrame(“便携式测试文件查看”);
专用JTable表;
私有最终字符串[]columnNames={“测试1”、“测试2”、“测试3”、“测试4”,
“测试5”、“测试6”、“测试7”、“测试8”、“测试9”、“测试10”};
私有最终对象[][]数据={
{"+", "+", "", "", "", "~", "", "", "", ""},
{"-", "+", "", "", "", "", "", "", "", ""},
{"+", "+", "", "", "~", "", "", "", "", ""},
{"+", "+", "", "", "", "", "~", "", "", ""},
{"+", "-", "", "~", "", "", "", "", "", ""},
{"+", "-", "", "", "", "", "", "", "", ""},
{"+", "-", "", "", "", "", "", "", "", ""},
{"-", "+", "~", "", "", "", "", "", "", "+"}
};
private DefaultTableModel=new DefaultTableModel(数据、列名);
公共Ptf_查看器(){
表=新的JTable(数据、列名称){
//准备者的逻辑位置
};
标签