Java 定义的单元格更改时的 jTable 颜色行
Java jTable color row on defined cell change
大家好,我没有发现下面的代码有什么不正确之处。它填充 table 和 headers 就好了。但是,当我将 row 1, colum 1 更改为 test 并单击关闭时,它不会像我预期的那样为行着色。然后点击我点击的那个变成绿色,然后我点击 table 的任何地方从那时起就变成绿色。
该列不会从 1(公司) 更改,因为这将是将进行更改的默认列。 行是这里唯一的动态数字。
要测试的流程:
- double-click IBM.
- 输入测试.
- 单击任何其他单元格以保存该单元格值。
- 行不变(第 1 行)。
- 再次单击测试单元格。
- 所有行都将变为绿色。
预期流量:
- double-click IBM.
- 输入测试.
- 单击任何其他单元格以保存该单元格值。
- 更改为 test 的单元格更改了该行 green。
- 单击单元格 (3, 3).
的 共享
- double-click 并将 4000 更改为 1000.
- 单击任何其他单元格以保存该单元格值。
- 更改为 1000 的单元格更改该行 red.
填充了 table 和 headers:
单击并将 第 1 行第 1 列 值更改为 test:
编辑后单击该单元格到另一个单元格:
现在,单击任何其他单元格(注意测试行不是绿色,因为它应该是):
现在点击我编辑的单元格 test:
你看到上面它只是为我点击的每一行着色,不管我说的逻辑如何
if ("test".equals(type)) {....
java代码:
@SuppressWarnings("serial")
public class TableRowRenderingTip extends JPanel {
public TableRowRenderingTip() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data =
{
{"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE},
{"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE},
{"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE},
{"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE},
{"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int column) {
return getValueAt(1, column).getClass();
}
};
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Border", createBorder(model));
add(tabbedPane);
}
private JComponent createBorder(DefaultTableModel model) {
JTable table = new JTable(model) {
private Border outside = new MatteBorder(1, 0, 1, 0, Color.RED);
private Border _outside = new MatteBorder(1, 0, 1, 0, Color.GREEN);
private Border inside = new EmptyBorder(0, 1, 0, 1);
private Border highlight = new CompoundBorder(outside, inside);
private Border _highlight = new CompoundBorder(_outside, inside);
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
JComponent jc = (JComponent)c;
String type = (String)getModel().getValueAt(convertRowIndexToModel(row), 1);
if (isRowSelected(row)) {
if ("test".equals(type)) {
jc.setBorder( _highlight ); // Green color
jc.setBackground(Color.GREEN);
} else {
jc.setBorder( highlight ); //Red color
}
}
return c;
}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
//table.changeSelection(0, 0, false, false);
return new JScrollPane( table );
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Table Row Rendering");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableRowRenderingTip() );
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
所以不用说我有点沮丧,因为我已经为此工作了几个小时,现在试图找出可能是什么问题。
我确定我正在查看的内容很简单...
如果测试条件不成立,您忘记设置边框和突出显示为默认值。例如
if (isRowSelected(row)) {
if ("test".equals(type)) {
jc.setBorder(_highlight); // Green color
jc.setBackground(Color.GREEN);
} else {
jc.setBorder(highlight); // Red color
}
} else {
jc.setBorder(null);
jc.setBackground(null);
}
大家好,我没有发现下面的代码有什么不正确之处。它填充 table 和 headers 就好了。但是,当我将 row 1, colum 1 更改为 test 并单击关闭时,它不会像我预期的那样为行着色。然后点击我点击的那个变成绿色,然后我点击 table 的任何地方从那时起就变成绿色。
该列不会从 1(公司) 更改,因为这将是将进行更改的默认列。 行是这里唯一的动态数字。
要测试的流程:
- double-click IBM.
- 输入测试.
- 单击任何其他单元格以保存该单元格值。
- 行不变(第 1 行)。
- 再次单击测试单元格。
- 所有行都将变为绿色。
预期流量:
- double-click IBM.
- 输入测试.
- 单击任何其他单元格以保存该单元格值。
- 更改为 test 的单元格更改了该行 green。
- 单击单元格 (3, 3). 的 共享
- double-click 并将 4000 更改为 1000.
- 单击任何其他单元格以保存该单元格值。
- 更改为 1000 的单元格更改该行 red.
填充了 table 和 headers:
单击并将 第 1 行第 1 列 值更改为 test:
编辑后单击该单元格到另一个单元格:
现在,单击任何其他单元格(注意测试行不是绿色,因为它应该是):
现在点击我编辑的单元格 test:
你看到上面它只是为我点击的每一行着色,不管我说的逻辑如何
if ("test".equals(type)) {....
java代码:
@SuppressWarnings("serial")
public class TableRowRenderingTip extends JPanel {
public TableRowRenderingTip() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data =
{
{"Buy", "IBM", new Integer(1000), new Double(80.5), Boolean.TRUE},
{"Sell", "Dell", new Integer(2000), new Double(6.25), Boolean.FALSE},
{"Short Sell", "Apple", new Integer(3000), new Double(7.35), Boolean.TRUE},
{"Buy", "MicroSoft", new Integer(4000), new Double(27.50), Boolean.FALSE},
{"Short Sell", "Cisco", new Integer(5000), new Double(20), Boolean.TRUE}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int column) {
return getValueAt(1, column).getClass();
}
};
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Border", createBorder(model));
add(tabbedPane);
}
private JComponent createBorder(DefaultTableModel model) {
JTable table = new JTable(model) {
private Border outside = new MatteBorder(1, 0, 1, 0, Color.RED);
private Border _outside = new MatteBorder(1, 0, 1, 0, Color.GREEN);
private Border inside = new EmptyBorder(0, 1, 0, 1);
private Border highlight = new CompoundBorder(outside, inside);
private Border _highlight = new CompoundBorder(_outside, inside);
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
JComponent jc = (JComponent)c;
String type = (String)getModel().getValueAt(convertRowIndexToModel(row), 1);
if (isRowSelected(row)) {
if ("test".equals(type)) {
jc.setBorder( _highlight ); // Green color
jc.setBackground(Color.GREEN);
} else {
jc.setBorder( highlight ); //Red color
}
}
return c;
}
};
//table.setPreferredScrollableViewportSize(table.getPreferredSize());
//table.changeSelection(0, 0, false, false);
return new JScrollPane( table );
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Table Row Rendering");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableRowRenderingTip() );
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
所以不用说我有点沮丧,因为我已经为此工作了几个小时,现在试图找出可能是什么问题。
我确定我正在查看的内容很简单...
如果测试条件不成立,您忘记设置边框和突出显示为默认值。例如
if (isRowSelected(row)) {
if ("test".equals(type)) {
jc.setBorder(_highlight); // Green color
jc.setBackground(Color.GREEN);
} else {
jc.setBorder(highlight); // Red color
}
} else {
jc.setBorder(null);
jc.setBackground(null);
}