我有两个JTable,它们被设置为可以拖放每个JTable中的行。问题是它允许我将一行从一个JTable拖到另一个JTable,我正试图找出如何阻止它。我只希望用户能够在同一个JTable中拖放一行。
换句话说,当我在当前表外拖动一行并将鼠标悬停在空白面板空间上时,鼠标光标会显示一个带对角线的圆,这就是我想要的。然而,当我将鼠标拖动到另一个表上时,它会显示一个小的矩形“拖放”图标,这就是我试图阻止的。当用户试图将这一行拖到其他表的顶部时,我希望出现带对角线的小圆圈。
这是一个演示问题的工作示例:
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DragSource;
import java.util.ArrayList;
import java.util.List;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.table.AbstractTableModel;
public class JTableDnD extends JFrame
{
private JTable tableA;
private JTable tableB;
public JTableDnD()
{
// *** Create First Table ***
List<Object[]> dataA = new ArrayList<Object[]>();
dataA.add(new Object[] {"A1", "A1"});
dataA.add(new Object[] {"A2", "A2"});
dataA.add(new Object[] {"A3", "A3"});
List<String> columnsA = new ArrayList<String>();
columnsA.add("Column 1");
columnsA.add("Column 2");
tableA = new JTable(new TableModel(columnsA, dataA));
tableA.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableA.setDragEnabled(true);
tableA.setDropMode(DropMode.INSERT_ROWS);
tableA.setFillsViewportHeight(true);
tableA.setTransferHandler(new TableTransferHandler(tableA));
JScrollPane scrollPaneA = new JScrollPane(tableA);
// *** Create Second Table ***
List<Object[]> dataB = new ArrayList<Object[]>();
dataB.add(new Object[] {"B1", "B1"});
dataB.add(new Object[] {"B2", "B2"});
dataB.add(new Object[] {"B3", "B3"});
List<String> columnsB = new ArrayList<String>();
columnsB.add("Column 1");
columnsB.add("Column 2");
tableB = new JTable(new TableModel(columnsB, dataB));
tableB.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tableB.setDragEnabled(true);
tableB.setDropMode(DropMode.INSERT_ROWS);
tableB.setFillsViewportHeight(true);
tableB.setTransferHandler(new TableTransferHandler(tableB));
JScrollPane scrollPaneB = new JScrollPane(tableB);
// *** Add ScrollPanes to Panel ***
this.getContentPane().setLayout(new FlowLayout());
add(scrollPaneA);
JPanel emptyPanel = new JPanel();
emptyPanel.setPreferredSize(new Dimension(100, 200));
add(emptyPanel);
add(scrollPaneB);
} // end JTableDnD constructor
private static void createAndShowGUI()
{
JFrame frame = new JTableDnD();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
interface Reorderable
{
public void reorder(int from, int to);
}
class TableModel extends AbstractTableModel implements Reorderable
{
private List<String> columnNames;
private List<Object[]> data;
public TableModel(List<String> columnNames, List<Object[]> data)
{
super();
this.columnNames = columnNames;
this.data = data;
}
@Override
public void reorder(int from, int to)
{
if (from < to)
{
to--;
}
Object[] row = data.remove(from);
data.add(to, row);
fireTableDataChanged();
}
@Override
public int getRowCount()
{
return data.size();
}
@Override
public int getColumnCount()
{
return columnNames.size();
}
@Override
public String getColumnName(int column)
{
return columnNames.get(column);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
return data.get(rowIndex)[columnIndex];
}
} // end TableModel
class TableTransferHandler extends TransferHandler
{
private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, DataFlavor.javaJVMLocalObjectMimeType, "Integer Row Index");
private JTable table = null;
public TableTransferHandler(JTable table)
{
this.table = table;
}
@Override
protected Transferable createTransferable(JComponent component)
{
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
}
@Override
public boolean canImport(TransferHandler.TransferSupport support)
{
boolean b = support.getComponent() == table &&
support.isDrop() &&
support.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
}
@Override
public int getSourceActions(JComponent component)
{
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport support)
{
JTable target = (JTable) support.getComponent();
JTable.DropLocation dropLocation = (JTable.DropLocation) support.getDropLocation();
int index = dropLocation.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max)
{
index = max;
}
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try
{
Integer rowFrom = (Integer) support.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index)
{
((Reorderable) table.getModel()).reorder(rowFrom, index);
if (index > rowFrom)
{
index--;
}
target.getSelectionModel().addSelectionInterval(index, index);
return true;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent component, Transferable transferable, int action)
{
if (action == TransferHandler.MOVE)
{
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
} // end TableTransferHandler
我相信我需要在canimport()方法中添加一些额外的逻辑,以确保正在删除的行来自同一个表,但我似乎无法弄清楚。我尝试检查传递到canimport()的TransferSupport对象中的数据,但它似乎没有任何返回确切JTable对象源的函数。
在简化的Swing DnD中,不支持获取可转移的源。TransferSupport'返回的组件是删除的目标,即应该以某种方式处理相关可转移的组件。因此,如果您有一个配置了特定表的每个组件TransferHandler,则支持的组件将始终是同一个表实例,并且您的检查将非常真实。
如果要基于发送方启用/禁用拖放,则必须按每次拖动提供:拖动从exportAsDrag开始,到exportDone结束,因此可以在其中设置/null发送方。
@Override
protected void exportDone(JComponent component,
Transferable transferable, int action) {
table = null;
}
@Override
public void exportAsDrag(JComponent comp, InputEvent e, int action) {
table = (JTable) comp;
super.exportAsDrag(comp, e, action);
}
现在,您可以跨表的多个实例重用处理程序的相同实例:
TableTransferHandler handler = new TableTransferHandler();
tableA.setTransferHandler(handler);
tableB.setTransferHandler(handler);
顺便说一句:我不会摆弄游标,它们被支持在dnd子系统的完全控制之下。
我有两个名为表1和表2的表,每个表由两行组成。 我可以在同一个表中拖放元素 您能告诉我是否可以将表行从表1拖放到表2,反之亦然(在不同的表中移动行) 这是两个表的超文本标记语言 还有我的js代码 这是我的小提琴 https://jsfiddle.net/wdy1ty89/7/
问题内容: 我想在Python中的两个值之间切换,即0到1之间。 例如,当我第一次运行一个函数时,它产生数字0。下一次,它产生1。第三次它返回零,依此类推。 抱歉,如果这样做没有道理,但是有人知道这样做的方法吗? 问题答案: 用途: 请注意,如果您需要比更为复杂的周期,那么此解决方案将比此处发布的其他解决方案更具吸引力。
问题内容: 我目前正在尝试在一个div的右下角到另一个div的右上角之间绘制一条对角线。如果可能的话,我想不用jQuery。这可能吗? 问题答案: 由于CSS限制,这不适用于IE8或更低版本。 距离公式 寻找两点的中心 寻找两点之间的角度 CSS转换:旋转 HTML元素的offset [Width | Height | Top | Left]属性 编辑(对于其他有相同问题的用户) : 例如,如果需
我有项目租赁应用程序。我需要决定在date_finish和date_start(包括这些日期)之间的日期中是否有car可用。我有模型车和订单。订单有很少的字段:和、如何只取这些在start_date和stop_date之间可用的CARID(包括这两天)。 汽车: 订单: 状态:1为新订单,2为当前持续的订单,3为存档/已完成的订单 mongoose查询: 那个查询不起作用。谁能帮我? 编辑:我必须
问题内容: 这是我正在使用的代码。 我将单独的main方法与此代码一起调用上述方法: 有没有一种方法可以轻松在输出之间添加空格?这是当前的样子: 问题答案: 添加文字空间或制表符:
我有组表,它有列id,名称,时间戳。当有一个组的更新时,时间戳也被更新为Current。 我正在尝试使用查询显示两个ID之间的组计数。 group表具有: 任何帮助都是非常感谢的。