【问题标题】:How to clear a selected cell in JTable?如何清除 JTable 中选定的单元格?
【发布时间】:2020-04-30 15:02:07
【问题描述】:

我可以通过单击来选择JTable 中的单元格并将其设置为焦点,现在我想更改焦点单元格上的值。为了改变它的值,我必须双击!有什么方法可以清除/更改该焦点单元格的值(通过单击)?

我试过jTable1.setValueAt("", row, column);,这会清除后台的值(它没有在GUI中更新/相同的旧值出现在单元格中)。

表结构:

jTable1.addMouseListener(new MouseAdapter(){
    @Override
    public void mouseClicked(final MouseEvent e) {
        if (e.getClickCount()==1){
            final JTable jTable=(JTable)e.getSource();
            final int row = jTable.getSelectedRow();
            final int column = jTable.getSelectedColumn();
            jTable1.editCellAt(row,column);
            jTable1.getEditorComponent().requestFocus();
            final Double valueInCell = (Double)jTable.getValueAt(row, column);
            System.out.println(valueInCell);
        }
    }
});

【问题讨论】:

标签: java swing jtable


【解决方案1】:

如果您只想清除或更改保存字符串的 JTable 单元格,为什么不简单地调用 JTable 的 setValueAt(Object o, int row, int column) 方法呢?要清除,请传入"",设置为不同的值,然后传入不同的字符串。

比如我的minimal reproducible example:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.*;
import java.util.Arrays;
import java.util.Vector;
import java.util.Random;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class TableFoo extends JPanel {
   private static final Vector<String> COLUMN_NAME_VECTOR = new Vector<String>(
         Arrays.asList(new String[] { "A", "B", "C" }));
   private static final int COLUMN_COUNT = COLUMN_NAME_VECTOR.size();
   private JTable table = new JTable();

   public TableFoo() {
      table.setFillsViewportHeight(true);
      fillTableData();
      MyMouse myMouse = new MyMouse();
      table.addMouseListener(myMouse);

      setLayout(new BorderLayout());
      add(new JScrollPane(table), BorderLayout.CENTER);
   }

   class MyMouse extends MouseAdapter {
       @Override
       public void mousePressed(final MouseEvent e) {
            final int row = table.getSelectedRow();
            final int column = table.getSelectedColumn();
            table.setValueAt("", row, column);
       }

   }

   public void fillTableData() {
      Vector<Vector<String>> matrix = new Vector<Vector<String>>();
      int rowCount = 8;
      for (int i = 0; i < rowCount ; i++) {
         Vector<String> row = new Vector<String>();
         for (int j = 0; j < COLUMN_COUNT; j++) {
            String rowText = String.format("row %d col %d", i, j);
            row.add(rowText );
         }
         matrix.add(row);
      }
      DefaultTableModel model = new DefaultTableModel(matrix,
            COLUMN_NAME_VECTOR);
      table.setModel(model);
   }

   private static void createAndShowGui() {
      TableFoo mainPanel = new TableFoo();

      JFrame frame = new JFrame("TableFoo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 正如我上面提到的,将"" 传递给setValueAt 不会更改GUI 中的值(相同的旧值出现在单元格中),
  • @Pranavan:那么您的代码中存在一个未显示的错误。请注意,我发布了一个小而完整且可编译/可运行的程序,该程序演示了setValueAt(...) 确实 工作。您有责任向我们展示为什么您的具体尝试使用它不起作用,并再次发布有效的minimal reproducible example 程序帖子(正如我在回答中发布的那样)可能是您实现这一目标的唯一方法。
  • @Pranavan:事实上,您发布的代码甚至没有显示您在哪里或如何调用setValueAt(...) ?!这是为什么呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2011-06-29
  • 1970-01-01
  • 2022-01-02
  • 2017-06-24
  • 1970-01-01
相关资源
最近更新 更多