【问题标题】:Is it possible to disable drag and drop for specific cell in JTable?是否可以禁用 JTable 中特定单元格的拖放功能?
【发布时间】:2014-06-18 13:00:16
【问题描述】:

我正在尝试在Jtable 中拖放单元格。它有效,但现在我想知道是否可以仅对第一个单元格禁用拖放,例如因为我不希望修改此单元格?

这里是代码

public class Test extends JFrame {
public Test() {
    setSize(500, 200);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel pan = new JPanel();
    pan.setLayout(new GridLayout(1, 1, 5, 5));

    Object[][] data = new Object[][] { { "00", "10", null }, { "01", "11", null }, { "02", "20", null } };
    String[] name = new String[] { "a", "b", "c" };
    DefaultTableModel model = new DefaultTableModel(data, name);
    JTable jt = new JTable(model);
    pan.add(jt);

    jt.setRowHeight(24);
    jt.setRowSelectionAllowed(false);

    jt.setFillsViewportHeight(true);
    jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jt.setDragEnabled(true);
    jt.setDropMode(DropMode.USE_SELECTION);
    jt.setTransferHandler(new MyTransferHandlerT());

    setContentPane(pan);
    setVisible(true);
}

public static void main(String[] args) {
    new Test();
}
}

以及TransferHandler的代码

public class MyTransferHandlerT extends TransferHandler {

 private JTable table;
 private DefaultTableModel model;
 private int rowIndex;
 private int colIndex;

@Override
public int getSourceActions(JComponent c) {
    return MOVE;
}

@Override
protected Transferable createTransferable(JComponent source) {

    table= (JTable)source;
    model = (DefaultTableModel) table.getModel();
    rowIndex = table.getSelectedRow();
    colIndex = table.getSelectedColumn();


    model.getValueAt(rowIndex, colIndex);

    String value = (String)model.getValueAt(rowIndex, colIndex);
    Transferable t = new StringSelection(value);
    return t;
}

@Override
protected void exportDone(JComponent source, Transferable data, int action) {

    table= (JTable)source;
    model = (DefaultTableModel) table.getModel();
    rowIndex = table.getSelectedRow();
    colIndex = table.getSelectedColumn();

    model.setValueAt("", rowIndex, colIndex);
}

@Override
public boolean canImport(TransferSupport support) {
    if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        return false;
    }
    return true;
}

@Override
public boolean importData(TransferSupport support) {

    table = (JTable) support.getComponent();
    Object data= null;
    int row = table.getSelectedRow();
    int col = table.getSelectedColumn();



    try {
        data = (Object) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
    } catch (UnsupportedFlavorException e) {
        System.out.println("unsupported Flavor Exception");
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("IO Exception");
        e.printStackTrace();
    }

    model.setValueAt(data, row, col);
    model.fireTableStructureChanged();
    return false;
}
}

谢谢。

【问题讨论】:

  • 我不确定,但您可以尝试在不应拖动单元格时在方法 createTransferable(JComponent) 中返回 null。
  • 我尝试在 createTransferable 中添加: if (model.getValueAt(0,0)=="00") {return null} 但它不起作用。请问你能展示一下你会怎么做吗?

标签: java swing drag-and-drop jtable


【解决方案1】:
model.setValueAt(data, row, col);
//model.fireTableStructureChanged();

不要直接调用 fireTableStructureChanged() 方法。那是 TableModel 的职责。

是否可以只对第一个单元格禁用拖放

请参阅 Location Sensitive Drop 上的 Swing 教程部分。它有一个示例将禁用第一列的拖放。

【讨论】:

  • 是的,谢谢它可以禁用拖放,但不能用于拖动。所以必须写一些额外的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2018-07-20
  • 1970-01-01
  • 2023-02-01
  • 2013-01-10
相关资源
最近更新 更多