【问题标题】:jtable tablecellrenderer not doing anythingjtable tablecellrenderer 什么都不做
【发布时间】:2014-01-07 06:41:29
【问题描述】:

我正在尝试检查,如果单元格 3 的值不为空白,则整行将被涂成绿色,但这没有任何作用,但是,如果我不检查,只检查以确保没有已选中(这样选择会给出颜色以显示您确实选择了)所有内容都被绘制为绿色。

if (!table.isRowSelected(row))
            {
                component.setBackground(getBackground());


                if(table.getModel().getValueAt(row, 3).equals(""))
                {
                component.setBackground(Color.GREEN);
                }
            }

我尝试输出值并且一切正常,这里有问题吗?一种不同的方式来做到这一点?谢谢

【问题讨论】:

    标签: java swing jtable cell tablecellrenderer


    【解决方案1】:

    另一种方法?

    查看Table Row Rendering 了解不需要您使用自定义渲染器的不同方法。

    这种方法更容易,因为当您在每个表列中具有不同类型的数据时,您不需要自定义渲染器。

    【讨论】:

      【解决方案2】:

      我尝试输出值并且一切正常,是否有 这里有问题?另一种方法?

      我们需要更多代码/信息来正确回答这个问题:

      无论如何,我建议您查看How to Use Tables 线索中的Using Custom Renderer 部分。您还可以查看下面的示例并将其作为起点:

      import java.awt.Color;
      import java.awt.Component;
      import javax.swing.JFrame;
      import javax.swing.JScrollPane;
      import javax.swing.JTable;
      import javax.swing.SwingUtilities;
      import javax.swing.table.DefaultTableCellRenderer;
      import javax.swing.table.DefaultTableModel;
      
      public class Demo {
      
          private void initGUI() {
      
              DefaultTableModel model = new DefaultTableModel(new Object[]{"Manufacturer", "Model", "Country", "Price"}, 0);
              model.addRow(new Object[]{"Fender", "Stratocaster", "Japan", ""});
              model.addRow(new Object[]{"Gibson", "Les Paul", "USA", "$ 1599"});
              model.addRow(new Object[]{"Jackson", "Soloist S3", "Japan","$ 1299"});
              model.addRow(new Object[]{"Paul Reed Smith","Standard 24", "USA", ""});
      
              JTable table = new JTable(model);
      
              table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
                  @Override
                  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {                
                      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                      if(!isSelected){
                          Color background = table.getModel().getValueAt(row, 3).equals("") ? Color.GREEN : table.getBackground();
                          setBackground(background);
                      } else {
                          setBackground(table.getSelectionBackground());
                      }
                      return this;
                  }            
              });
      
              JFrame frame = new JFrame("Demo");      
              frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
              frame.getContentPane().add(new JScrollPane(table));
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
          }
      
          public static void main(String[] args) {   
              SwingUtilities.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      new Demo().initGUI();
                  }
              });
          }
      }
      

      图片

      【讨论】:

      • 我试过像你的一样,它只是把所有东西都涂成绿色,即使有些值是空白的
      • @allegroBegin 问题是您永远不会覆盖DefaultTableCellRenderer bg 颜色,您只需将bg 颜色设置为component。当JTable 将渲染第二个单元格和下一个单元格时,此调用:component.setBackground(getBackground()); 会将背景颜色设置为绿色。在我的示例中,我不使用component 变量,而是覆盖DefaultTableCellRenderer 的背景颜色并改用return this。这就是诀窍。看看this topic
      • 好的,谢谢您的提示,但是,为什么您的方式会跳过任何检查(与 rowrenderer 一起使用并使所有内容变为绿色的相同检查?只是想了解。如果它是'不是很容易解释为一个常见的错误,然后没关系,非常感谢你的帮助,如果我有权利,我会投票
      • @allegroBegin 我不确定我是否正确理解了最后一个问题(对不起,如果我没有),但有两个检查:第一个是询问是否未选择单元格@ 987654338@,第二个是设置正确的颜色,如果我使用三元运算符制作的第三列为空:Color background = table.getModel().getValueAt(row, 3).equals("") ? Color.GREEN : table.getBackground();
      【解决方案3】:

      你的 if 语句正确吗?您必须检查非空白单元格

      所以,你的 if 语句应该是这样的

      if(!table.getModel().getValueAt(row, 3).equals(""))

      还要检查单元格#3 的值,您必须像这样使用索引 2。

      if(!table.getModel().getValueAt(row, 2).equals(""))

      【讨论】:

      • 嗨,我的 if 语句是正确的,我要去单元格 4,如果单元格是空白的,就这样做。我在语句中有一个输出,它将打印语句值(真和单元格“”的值),所以它已经是真的,因为它得到了它,我也三重检查了。感谢您的尝试,我会查看其他答案。
      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 2011-11-09
      • 2019-03-08
      • 2016-12-24
      • 2017-04-18
      • 2011-08-03
      • 2014-05-11
      • 2014-09-10
      相关资源
      最近更新 更多