java - 如何删除 JTable 选定行(第一列有复选框)的文本?

标签 java swing jtable strikethrough

我有一个 Jtable,第一列有一个复选框。选中复选框后,我想删除一行文本。 (例如,当我们的任务完成时,就像我们在 Microsoft Outlook 中所做的一样。)我尝试过使用 AttributeString,但无法做到。

谁能指导我解决这个问题?

String strStrike; 
AttributedString as; 

public void setTextStrikeThrough() {
    for(int r=0;r< taskcells.length;r++) {
        if (ttable.getValueAt(r,0).equals(Boolean.TRUE)) { 
            for(int c=2;c<7;c++) {
                strStrike+=taskcells[r][c-1]; 
            }//end inner for as=new
            AttributedString(strStrike); 
            as.addAttribute(TextAttribute.STRIKETHROUGH,
                TextAttribute.STRIKETHROUGH_ON);
            as.getIterator(); 
        }//end if 
    }//end for       
}

我不知道在哪里调用这个方法。当该行的复选框被选中时,我想在该行的文本上添加删除线。

最佳答案

我不知道 ActionListener 是否适用于 JTable 中的 JCheckBox,因为复选框不是真正的按钮,而是复选框的呈现。也许玩 table 模型会有所帮助。例如,您可以使用 HTML 来显示表格单元格中显示的字符串的删除线。例如,在下面,我创建了一个自定义 TableModel,它扩展了 DefaultTableModel 并保存带有 boolean 对象的行,后跟我创建的 TextWrapper 类的对象,该类根据 boolean 值更改其 toString 结果。

例如,

import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class StrikeThroughRow {
   public static final Object[][] DATA = {{Boolean.TRUE, "Monday", "fe"},
      {Boolean.FALSE, "Tuesday", "fi"}, {Boolean.TRUE, "Wednesday", "fo"},
      {Boolean.FALSE, "Thursday", "fum"}, {Boolean.TRUE, "Friday", "foo"}};

   public StrikeThroughRow() {

   }

   private static void createAndShowUI() {
      JTable table = new JTable(new StrikeThroughModel(DATA));
      JScrollPane scrollpane = new JScrollPane(table);

      JFrame frame = new JFrame("StrikeThroughRow");
      frame.getContentPane().add(scrollpane);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class StrikeThroughModel extends DefaultTableModel {
   public StrikeThroughModel(Object[][] data) {
      super(new String[]{"Check", "Work Day", "Giant Speak"}, 0);
      for (int i = 0; i < data.length; i++) {
         Vector<Object> rowVect = new Vector<Object>();
         rowVect.add(data[i][0]);
         if (data[i].length > 1) {
            for (int j = 1; j < data[i].length; j++) {
               rowVect.add(new TextWrapper(data[i][j].toString(), (Boolean)data[i][0]));
            }
         }
         addRow(rowVect);
      }
   }

   @Override
   public Class<?> getColumnClass(int columnIndex) {
      if (columnIndex == 0) {
         return Boolean.class;
      }
      return super.getColumnClass(columnIndex);
   }

   @Override
   public void setValueAt(Object value, int row, int column) {
      if (column == 0) {
         for (int i = 1; i < getColumnCount(); i++) {
            TextWrapper textWrapper = (TextWrapper) getValueAt(row, i);
            textWrapper.setStrikeThrough((Boolean) value);
            fireTableCellUpdated(row, i);
         }
      }
      super.setValueAt(value, row, column);
   }
}

class TextWrapper {
   private String text;
   private boolean strikeThrough = false;

   public TextWrapper(String text) {
      this.text = text;
   }

   public TextWrapper(String text, boolean strikeThrough) {
      this(text);
      this.strikeThrough = strikeThrough;
   }

   @Override
   public String toString() {
      if (strikeThrough) {
         return "<html><strike>" + text + "</html></strike>"; 
      }
      return text;
   }

   public void setStrikeThrough(boolean strikeThrough) {
      this.strikeThrough = strikeThrough;
   }
}

我打赌有更好的解决方案,包括为您的单元格创建自定义渲染器,但上面的代码提供了一个快速但不完善的修复。

关于java - 如何删除 JTable 选定行(第一列有复选框)的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5277220/

相关文章:

java - 如何在jTable中显示数据库内容?

Java 静态自引用

java - 我如何处理 Selenium 和 Java 中的引导日期选择器

java - 网格布局无法正确显示

java - 如何删除框架的 Activity 标题栏?

java - 如何从jtable中删除一行

java - 如何在 Java 应用程序中播放 .SWF?

JAVA:与不同源文件夹下存在的相同包和类名称冲突

java - 使 JScrollPane 自动向下滚动

java - 数据库更新时使用 AbstractTableModel 更新 JTable