Java 除非选择单元格,否则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

我正在创建一个JTable,其中包含两个向量、行数据和列名称中的数据。我正在使用渲染器为JTable提供我想要的颜色。但数据是不可见的,除非我单击某个单元格:然后只有该单元格数据才可见

我的代码:

   // 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());)一起工作,我不需要在你编辑后试用这个