#java #swing #drag-and-drop #jtable
#java #swing #перетаскивание #jtable
Вопрос:
Я пытаюсь перетаскивать ячейки в моем 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;
}
}
Спасибо.
Комментарии:
1. Я не уверен, но вы можете попытаться вернуть null в методе
createTransferable(JComponent)
, когда ячейку не следует перетаскивать.2. Я пытаюсь добавить это: if (model.getValueAt(0,0)==»00″) { return null} в createTransferable, но это не работает. Пожалуйста, можете ли вы показать, как вы это сделаете?
Ответ №1:
model.setValueAt(data, row, col);
//model.fireTableStructureChanged();
Не вызывайте метод firetablestructure_changed() напрямую. За это отвечает TableModel.
можно ли отключить перетаскивание только для первой ячейки
См. Раздел из руководства по Swing, посвященный падению с учетом местоположения. В нем есть пример, который отключит перетаскивание в первом столбце.
Комментарии:
1. Да, спасибо, это работает для отключения удаления, но не для перетаскивания. Поэтому необходимо написать дополнительный код.