- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在同一列中将我的表的数据从一个表交换到另一个表(注意:我只有两列)。
我的问题是我无法交换值。此外,我希望仅在同一列上启用交换,否则,表值将重置为其原始值。
这是我的代码:
JTable table_1 = new JTable(model);
table_1.setPreferredScrollableViewportSize(new Dimension(300, 120));
table_1.setDragEnabled(true);
table_1.setDropMode(DropMode.USE_SELECTION);
table_1.setTransferHandler(new TransferHelper());
table_1.setRowSelectionAllowed(false);
table_1.setCellSelectionEnabled(true);
我的 TransferHelper 类:
class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
String data = (String) ((JTable) source).getModel().getValueAt(((JTable) source).getSelectedRow(), ((JTable) source).getSelectedColumn());
return new StringSelection(data);
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
((JTable) source).getModel().setValueAt("", ((JTable) source).getSelectedRow(), ((JTable) source).getSelectedColumn());
}
@Override
public boolean canImport(TransferSupport support) {
return true;
}
@Override
public boolean importData(TransferSupport support) {
JTable jt = (JTable) support.getComponent();
try {
jt.setValueAt(support.getTransferable().getTransferData(DataFlavor.stringFlavor), jt.getSelectedRow(), jt.getSelectedColumn());
} catch (UnsupportedFlavorException ex) {
} catch (IOException ex) {
}
return super.importData(support);
}
}
最佳答案
拖放不是一个简单的过程,它相当复杂且复杂。这种复杂性带来了灵 active 。
以这种方式交换值与“移动”本身 不同。移动某些东西时,您从源中取出它并将其放入目标中,这里我们在源和目标之间交换值,这意味着我们需要比通过 API 通常可用的信息更多的信息。
首先,您需要一个自定义类来保存要导出的数据,因为我们正在移动数据,这将需要一些额外的信息,特别是源组件...
下面只是一个简单的包装器。我们可以完全导出 JTable
,但我想演示拖放的基本概念...
import javax.swing.JTable;
public class CellData {
private JTable table;
public CellData(JTable table) {
this.table = table;
}
public int getColumn() {
return table.getSelectedColumn();
}
public String getValue() {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
return (String) table.getValueAt(row, col);
}
public JTable getTable() {
return table;
}
}
接下来,我们需要一个自定义的Transferable
来管理我们的数据...
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class CellDataTransferable implements Transferable {
public static final DataFlavor CELL_DATA_FLAVOR = createConstant(CellData.class, "application/x-java-celldata");
private CellData cellData;
public CellDataTransferable(CellData cellData) {
this.cellData = cellData;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{CELL_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
boolean supported = false;
for (DataFlavor available : getTransferDataFlavors()) {
if (available.equals(flavor)) {
supported = true;
}
}
return supported;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return cellData;
}
static protected DataFlavor createConstant(Class clazz, String name) {
try {
return new DataFlavor(clazz, name);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
最后,TransferHandler
....
public class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
// Create the transferable
// Because I'm hacking a little, I've included the source table...
JTable table = (JTable) source;
return new CellDataTransferable(new CellData(table));
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
}
@Override
public boolean canImport(TransferSupport support) {
// Reject the import by default...
boolean canImport = false;
// Can only import into another JTable
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable table = (JTable) comp;
// Need the location where the drop might occur
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
// Get the column at the drop point
int dragColumn = table.columnAtPoint(dp);
try {
// Get the Transferable, we need to check
// the constraints
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CellDataTransferable.CELL_DATA_FLAVOR);
// Make sure we're not dropping onto ourselves...
if (cd.getTable() != table) {
// Do the columns match...?
if (dragColumn == cd.getColumn()) {
canImport = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return canImport;
}
@Override
public boolean importData(TransferSupport support) {
// Import failed for some reason...
boolean imported = false;
// Only import into JTables...
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need to know where we are importing to...
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
int dropCol = target.columnAtPoint(dp);
int dropRow = target.rowAtPoint(dp);
try {
// Get the Transferable at the heart of it all
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CellDataTransferable.CELL_DATA_FLAVOR);
if (cd.getTable() != target) {
// Make sure the columns match
if (dropCol == cd.getColumn()) {
// Get the data from the "dropped" table
String exportValue = (String) target.getValueAt(dropRow, dropCol);
// Get the data from the "dragged" table
String importValue = cd.getValue();
// This is where we swap the values...
// Set the target/dropped tables value
target.setValueAt(importValue, dropRow, dropCol);
// Set the source/dragged tables values
JTable source = cd.getTable();
int row = source.getSelectedRow();
int col = source.getSelectedColumn();
source.setValueAt(exportValue, row, col);
imported = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return imported;
}
}
阅读评论:P
最后,一个可运行的例子......
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import static javax.swing.TransferHandler.MOVE;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TableSwap {
public static void main(String[] args) {
new TableSwap();
}
public TableSwap() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable t1 = createTable(0);
JTable t2 = createTable(20);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(0, 2));
frame.add(new JScrollPane(t1));
frame.add(new JScrollPane(t2));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected JTable createTable(int startAt) {
DefaultTableModel model = new DefaultTableModel(0, 2);
for (int index = 0; index < 10; index++) {
model.addRow(new Object[]{"0x" + (index + startAt), "1x" + (index + startAt)});
}
JTable table = new JTable(model);
table.setDragEnabled(true);
table.setDropMode(DropMode.USE_SELECTION);
table.setTransferHandler(new TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(true);
return table;
}
}
更新为仅支持单个表
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import static javax.swing.TransferHandler.MOVE;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TableSwap {
public static void main(String[] args) {
new TableSwap();
}
public TableSwap() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable t1 = createTable(0);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(t1));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected JTable createTable(int startAt) {
DefaultTableModel model = new DefaultTableModel(0, 2);
for (int index = 0; index < 10; index++) {
model.addRow(new Object[]{"0x" + (index + startAt), "1x" + (index + startAt)});
}
JTable table = new JTable(model);
table.setDragEnabled(true);
table.setDropMode(DropMode.USE_SELECTION);
table.setTransferHandler(new TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(true);
return table;
}
public class CellData {
private final Object value;
private final int col;
private final JTable table;
private final int row;
public CellData(JTable source) {
this.col = source.getSelectedColumn();
this.row = source.getSelectedRow();
this.value = source.getValueAt(row, col);
this.table = source;
}
public int getColumn() {
return col;
}
public Object getValue() {
return value;
}
public JTable getTable() {
return table;
}
public boolean swapValuesWith(int targetRow, int targetCol) {
boolean swapped = false;
if (targetCol == col) {
Object exportValue = table.getValueAt(targetRow, targetCol);
table.setValueAt(value, targetRow, targetCol);
table.setValueAt(exportValue, row, col);
swapped = true;
}
return swapped;
}
}
public static final DataFlavor CELL_DATA_FLAVOR = createConstant(CellData.class, "application/x-java-celldata");
public class CellDataTransferable implements Transferable {
private CellData cellData;
public CellDataTransferable(CellData cellData) {
this.cellData = cellData;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{CELL_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
boolean supported = false;
for (DataFlavor available : getTransferDataFlavors()) {
if (available.equals(flavor)) {
supported = true;
}
}
return supported;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return cellData;
}
}
static protected DataFlavor createConstant(Class clazz, String name) {
try {
return new DataFlavor(clazz, name);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
// Create the transferable
JTable table = (JTable) source;
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
return new CellDataTransferable(new CellData(table));
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
}
@Override
public boolean canImport(TransferSupport support) {
// Reject the import by default...
boolean canImport = false;
// Can only import into another JTable
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need the location where the drop might occur
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
// Get the column at the drop point
int dragColumn = target.columnAtPoint(dp);
try {
// Get the Transferable, we need to check
// the constraints
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CELL_DATA_FLAVOR);
// Make sure we're not dropping onto ourselves...
if (cd.getTable() == target) {
// Do the columns match...?
if (dragColumn == cd.getColumn()) {
canImport = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return canImport;
}
@Override
public boolean importData(TransferSupport support) {
// Import failed for some reason...
boolean imported = false;
// Only import into JTables...
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need to know where we are importing to...
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
int dropCol = target.columnAtPoint(dp);
int dropRow = target.rowAtPoint(dp);
try {
// Get the Transferable at the heart of it all
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CELL_DATA_FLAVOR);
if (cd.getTable() == target) {
if (cd.swapValuesWith(dropRow, dropCol)) {
imported = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return imported;
}
}
}
关于java - 如何通过拖放交换jtable中单元格的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381981/
这个问题在这里已经有了答案: Difference between Property and Field in C# 3.0+ (10 个答案) 关闭 10 年前。 我不明白静态属性之间的区别: p
当元素被拖放时,有没有办法从被拖动的元素中获取 id(或其他属性值)? 例如,在左侧,我有一堆 div,我可以将图像放入其中。右边有一个 div 用来保存图像。当我将图像从右侧拖动到左侧的 div 时
每当我更改其中一个类属性时,我想设置一个修改标志,如下所示 public bool Modified { get; set; } public bool Enabled { get; set { Mo
由于某种原因,我下面的代码曾经可以正常工作,但现在却引发了一个异常: public static async Task HttpPut(string inUrl, string inFilePath)
为什么将 ; 放在最佳实践中?在函数定义的末尾。 例如 var tony = function () { console.log("hello there"); }; 优于: var tony
我在容器内有一个位图。当我拖动容器时,光标变为编辑文本形状,图像也跳到光标的右下角(好像我从左上角拿着图像并拖动它)。 这是我的代码,所以你可以看到我有 RTFM: function createIc
这个问题已经有答案了: C# 3.0 auto-properties — useful or not? [closed] (17 个回答) 已关闭 6 年前。 当我让 Visual Studio 20
以类中的以下代码为例: public class Employee : IEntity { public string FirstName { get; set; } public s
我有 json 数据: { "products": [ { "productId" : 0, "productImg" : "../img/product-ph
这个问题在这里已经有了答案: What is the difference between a field and a property? (33 个答案) 关闭 9 年前。 我在一本书上找到这样声
我正在设置多个方法,想知道如何继续将一个变量(“顶部”变量)传递给不同的方法。 主要方法: public static void Main(string[] args) { i
我正在尝试使用 crontab 编写一个简单的任务,将一些文件从本地复制到 HDFS。我的代码是这样的: #!/bing/ksh ANIO=$(date +"%Y") MES=$(date +"%m"
有人可以告诉我如何使用这个解决方案来解决我的问题吗?我也想限制 id 中包含文本“not”的节点的拖/放。 jsTree drag and drop restrict folders by class
我的情况如下 - 我正在对可能包含链接行的表进行排序: row 1 row 2 row 3 row 4 row 5 我需要的是禁止在.linked-to-p
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在理解似乎不一致的方案中的破坏性操作时遇到问题。即为什么下例中bar没有变化 (define foo '(a b)) (define bar foo) (set! foo '(c d)) foo >
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在理解似乎不一致的方案中的破坏性操作时遇到问题。即为什么下例中bar没有变化 (define foo '(a b)) (define bar foo) (set! foo '(c d)) foo >
我在我的 Web 应用程序中使用 Ajax ControlToolkit 中的 ModalPopupExtender。我将其 Drag 属性设置为 true,但是当我拖动弹出面板并将其放到新位置时,它
所以,基于this answer ,我有一组可以拖放并卡入到位的 div。唯一的问题是,可拖动的 div 具有不同的高度,我需要它们始终捕捉到目标的底部,而不是顶部。 您可以在this JsFiddl
我是一名优秀的程序员,十分优秀!