Java 除非选择单元格,否则JTable数据不可见
我正在创建一个JTable,其中包含两个向量、行数据和列名称中的数据。我正在使用渲染器为JTable提供我想要的颜色。但数据是不可见的,除非我单击某个单元格:然后只有该单元格数据才可见 我的代码:Java 除非选择单元格,否则JTable数据不可见,java,swing,jtable,Java,Swing,Jtable,我正在创建一个JTable,其中包含两个向量、行数据和列名称中的数据。我正在使用渲染器为JTable提供我想要的颜色。但数据是不可见的,除非我单击某个单元格:然后只有该单元格数据才可见 我的代码: // Creating table final JTable tablaCurvas = new JTable(); // Applng colours and column sizes with renderer TableCellRenderer tableRende
// Creating table
final JTable tablaCurvas = new JTable();
// Applng colours and column sizes with renderer
TableCellRenderer tableRender = new TableRenderer();
tablaCurvas.setDefaultRenderer(Object.class, tableRender);
// Create an easy model to add data to table
tablaCurvas.setModel(new DefaultTableModel(rowData, columnNames){
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
//Only the second column
return column == 1;
}
});
// Necessary clicks to edit cell
((DefaultCellEditor) tablaCurvas.getDefaultEditor(Object.class)).setClickCountToStart(1);
// Add table into a scrollPane
JScrollPane scrollPane = new JScrollPane(tablaCurvas);
// Fill the pane
tablaCurvas.setFillsViewportHeight(true);
// Preferred size
tablaCurvas.setPreferredScrollableViewportSize(new Dimension(150,100));
和渲染器:
class TableRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
setEnabled(table == null || table.isEnabled());
if (column == 0)
setHorizontalAlignment(LEFT);
else // (column == 1)
setHorizontalAlignment(RIGHT);
for (int i=0; i<2; i++) {
TableColumn columna = table.getColumnModel().getColumn(i);
if (i==0){
columna.setPreferredWidth(150);
}
if (i==1) columna.setPreferredWidth(50);
}
setBackground(table.getBackground());
setForeground(table.getForeground());
if (row%2==1) setBackground(java.awt.Color.white);
else setBackground(new java.awt.Color(211, 217, 255));
return this;
}
class TableRenderer扩展了DefaultTableCellRenderer
{
私有静态最终长serialVersionUID=1L;
公共组件GetTableCellRenderComponent(
JTable表,
对象值,
他当选了,,
布尔聚焦,
int row,
int列)
{
setEnabled(table==null | | table.isEnabled());
如果(列==0)
设置水平对齐(左);
else/(列==1)
设置水平对齐(右);
对于(int i=0;i您必须为DefaultTableCellRenderer
组件设置文本
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
//.... your code
setText(value != null ? value.toString() : ""); // suppress null values
return this;
}
此屏幕截图是使用一些示例数据拍摄的:
您必须为DefaultTableCellRenderer
组件设置文本
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
//.... your code
setText(value != null ? value.toString() : ""); // suppress null values
return this;
}
此屏幕截图是使用一些示例数据拍摄的:
可能与您的问题无关:请勿更改渲染器目标(或其从属对象)的任何属性在GETXXRUNDER组件中,很容易导致难以检测的循环。考虑所有参数严格地读取,也许背景颜色与前景相同。我不认为背景颜色是问题,因为几分钟前它是可见的,当使用JTABLE没有模型时,当我添加了一个模型使第一列不可编辑,PR。问题出现了。你能更详细地解释你的第一个评论吗?听起来很有趣,我一直愿意学习阿曼,你不应该在渲染器中设置TableColumn的宽度。渲染器应该只更改自身的属性。@Kleopatra,我很惊讶你竟然忽略了这一点:-)@camickr-事实上,我告诉过他不要(或者至少尝试过,即使你没有得到它也不会成功:)-看到我的第一条评论可能与你的问题无关:不要更改渲染器目标(或其依赖项)的任何属性在GETXXRUNDER组件中,很容易导致难以检测的循环。考虑所有参数严格地读取,也许背景颜色与前景相同。我不认为背景颜色是问题,因为几分钟前它是可见的,当使用JTABLE没有模型时,当我添加了一个模型使第一列不可编辑,PR。问题出现了。你能更详细地解释一下你的第一个评论吗?听起来很有趣,我一直愿意学习阿曼,你不应该在渲染器中设置表列的宽度。渲染器应该只更改自身的属性。@Kleopatra,我很惊讶你竟然忽略了这一点:-)@camickr-事实上,我告诉过他不想(或者至少尝试过,即使你没有得到它也不会成功):-请看我的第一篇评论!但我不明白为什么。数据应该已经是字符串了,当我在没有模型的情况下将该数据输入JTable时,它工作正常。你能解释一下这里发生了什么吗?注意:它与你以前的答案(setText)一起工作(value.toString());),在您编辑Works之后,我不需要尝试这个!但我不明白为什么。数据应该已经是字符串了,当我在没有模型的情况下将该数据输入JTable时,它工作正常。您能解释一下这里发生了什么吗?注意:它与您以前的答案(setText(value.toString());)一起工作,我不需要在你编辑后试用这个