Swing之拖动篇:将文本中的内容拖动到表中
来源:互联网 发布:翦伯赞中国史纲要知乎 编辑:程序博客网 时间:2024/05/22 18:18
拖动操作的很多地方都有用到,比如我们的用QQ的时候也可以拖动文本信息。下面这个例子是通过重写TransferHandler类来实现控件之间的数据拖动。
TransferHandler类用于处理往返于 Swing 组件的 Transferable 的传输。该 Transferable 用于表示通过往/返于剪贴板的剪切、复制或粘贴操作进行交换的数据。它还在拖放操作中使用,以表示对组件进行拖动和放置组件。Swing 提供自动支持剪切、复制和粘贴的键盘绑定的功能,该键盘绑定使用由此类的实现提供的功能。Swing 还提供自动支持拖放操作的功能,该拖放操作使用由此类的实现提供的功能。Swing 开发人员可以主要通过在 Swing 组件上设置 transferHandler 属性专门指定传输语义。
例子:
import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.UnsupportedFlavorException;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.IOException;import javax.swing.BorderFactory;import javax.swing.Box;import javax.swing.BoxLayout;import javax.swing.DefaultListModel;import javax.swing.DropMode;import javax.swing.JCheckBoxMenuItem;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.ListSelectionModel;import javax.swing.SwingUtilities;import javax.swing.TransferHandler;import javax.swing.UIManager;import javax.swing.table.DefaultTableModel;public class FillViewportHeightDemo extends JFrame implements ActionListener { private DefaultListModel model = new DefaultListModel(); private int count = 0; private JTable table; private JCheckBoxMenuItem fillBox; private DefaultTableModel tableModel; private static String getNextString(int count) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < 5; i++) { buf.append(String.valueOf(count)); buf.append(","); } // remove last newline buf.deleteCharAt(buf.length() - 1); return buf.toString(); } private static DefaultTableModel getDefaultTableModel() { String[] cols = { "Foo", "Toto", "Kala", "Pippo", "Boing" }; return new DefaultTableModel(null, cols); } public FillViewportHeightDemo() { super("Empty Table DnD Demo"); tableModel = getDefaultTableModel(); table = new JTable(tableModel); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); table.setDropMode(DropMode.INSERT_ROWS); //增加表格拖动事件 table.setTransferHandler(new TransferHandler() { //指示一个组件在实际尝试导入给定数据 flavor 的集合之前是否接受导入。 public boolean canImport(TransferSupport support) { // for the demo, we'll only support drops (not clipboard paste) if (!support.isDrop()) { return false; } // we only import Strings if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } return true; } //导致从剪贴板或 DND 放置操作向组件的传输。 public boolean importData(TransferSupport support) { // if we can't handle the import, say so if (!canImport(support)) { return false; } // fetch the drop location JTable.DropLocation dl = (JTable.DropLocation) support .getDropLocation(); int row = dl.getRow(); // fetch the data and bail if this fails String data; try { //获得拖动数据 data = (String) support.getTransferable().getTransferData( DataFlavor.stringFlavor); } catch (UnsupportedFlavorException e) { return false; } catch (IOException e) { return false; } String[] rowData = data.split(","); //将数据增加到表格中 tableModel.insertRow(row, rowData); Rectangle rect = table.getCellRect(row, 0, false); if (rect != null) { table.scrollRectToVisible(rect); } // demo stuff - remove for blog model.removeAllElements(); model.insertElementAt(getNextString(count++), 0); // end demo stuff return true; } }); JList dragFrom = new JList(model); dragFrom.setFocusable(false); dragFrom.setPrototypeCellValue(getNextString(100)); model.insertElementAt(getNextString(count++), 0); dragFrom.setDragEnabled(true); dragFrom.setBorder(BorderFactory.createLoweredBevelBorder()); dragFrom.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { if (SwingUtilities.isLeftMouseButton(me) && me.getClickCount() % 2 == 0) { String text = (String) model.getElementAt(0); String[] rowData = text.split(","); tableModel.insertRow(table.getRowCount(), rowData); model.removeAllElements(); model.insertElementAt(getNextString(count++), 0); } } }); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); JPanel wrap = new JPanel(); wrap.add(new JLabel("Drag from here:")); wrap.add(dragFrom); p.add(Box.createHorizontalStrut(4)); p.add(Box.createGlue()); p.add(wrap); p.add(Box.createGlue()); p.add(Box.createHorizontalStrut(4)); getContentPane().add(p, BorderLayout.NORTH); JScrollPane sp = new JScrollPane(table); getContentPane().add(sp, BorderLayout.CENTER); fillBox = new JCheckBoxMenuItem("Fill Viewport Height"); fillBox.addActionListener(this); JMenuBar mb = new JMenuBar(); JMenu options = new JMenu("Options"); mb.add(options); setJMenuBar(mb); JMenuItem clear = new JMenuItem("Reset"); clear.addActionListener(this); options.add(clear); options.add(fillBox); getContentPane().setPreferredSize(new Dimension(260, 180)); } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == fillBox) { table.setFillsViewportHeight(fillBox.isSelected()); } else { tableModel.setRowCount(0); count = 0; model.removeAllElements(); model.insertElementAt(getNextString(count++), 0); } } private static void createAndShowGUI() { // Create and set up the window. FillViewportHeightDemo test = new FillViewportHeightDemo(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Display the window. test.pack(); test.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { // Turn off metal's use of bold fonts UIManager.put("swing.boldMetal", Boolean.FALSE); createAndShowGUI(); } }); }}
- Swing之拖动篇:将文本中的内容拖动到表中
- Swing之拖动篇:将文本中的内容拖动到表中
- Swing之拖动篇:将文本中的内容拖动到表中
- Qt拖动鼠标移动窗体中的内容
- 拖动
- 拖动
- 拖动
- 拖动
- 拖动交换单元格内容
- 拖动交换单元格内容
- 拖动矩形框,显示出框中的内容
- Flex中的拖动技术
- AS3中的拖动
- Flex中的拖动技术
- RecyclerView 拖动才刷新内容
- 用Swing处理图片缩放和拖动!!!
- Java 拖动Swing组件和图片
- HTML5之拖动图片
- 【不断更新中】MySql常用命令
- HttpClient通过Post上传文件
- Javascript 异步加载详解
- exceptional c++ item6-7 临时变量
- 配置hadoop 使用fair scheduler调度器
- Swing之拖动篇:将文本中的内容拖动到表中
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- 无法读取项目文件 .csproj,请确认 <Import> 声明中的路径正确,且磁盘上存在该文件
- using backup controlfile 和 until cancel区别
- 安装11g RAC Clustware 前可以用命令进行检查所有条件是否满足
- 关于 RMAN 备份 数据块 一致性的讨论
- 在vim中使用cscope查找调用、定义函数和变量的地方
- excel2007快捷键
- 兼容Xhmtl和各浏览器在网页中插入Flash的代码