12.4 Swing简化的拖放功能
从JDK1.4
开始,Swing
的部分组件已经提供了默认的拖放支持,从而能以更简单的方式进行拖放操作。Swing
中支持拖放操作的组件如表12.1所示
Swing 组件 |
作为拖放源导出 |
作为拖放目标接收 |
JColorChooser |
导出颜色对象的本地引用 |
可接收任何颜色 |
JFilechooser |
导出文件列表 |
无 |
JList |
导出所选择节点的HTML 描述 |
无 |
JTable |
导出所选中的行 |
无 |
JTree |
导出所选择节点的HTML 描述 |
无 |
JTextComponent |
导出所选文本 |
接收文本,其子类JTextArea 还可接收文件列表,负责将文件打开 |
在默认情况下,表12.1中的这些Swing
组件都没有启动拖放支持,可以调用这些组件的setDragEnabled(true)
方法来启动拖放支持。
程序 Swing拖放
下面程序示范了Swing
提供的拖放支持。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.awt.*; import javax.swing.*;
public class SwingDndSupport { JFrame jf = new JFrame("Swing的拖放支持"); JTextArea srcTxt = new JTextArea(8, 30); JTextField jtf = new JTextField(34);
public void init() { srcTxt.append("Swing的拖放支持.\n"); srcTxt.append("将该文本域的内容拖入其他程序.\n"); srcTxt.setDragEnabled(true); jtf.setDragEnabled(true); jf.add(new JScrollPane(srcTxt)); jf.add(jtf, BorderLayout.SOUTH); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); }
public static void main(String[] args) { new SwingDndSupport().init(); } }
|
上面程序中的
1 2
| srcTxt.setDragEnabled(true); jtf.setDragEnabled(true);
|
两行代码负责开始多行文本域和单行文本框的拖放支持。运行上面程序,会看到如图12.21所示的界面。
TransferHandler
除此之外,Swing
还提供了一种非常特殊的类:TransferHandler
,它可以直接将某个组件的指定属性设置成拖放目标,前提是该组件具有该属性的setter
方法。例如,JTextArea
类提供了一个setForeground(Color)
方法,这样即可利用TransferHandler
将foreground
定义成拖放目标。代码如下:
1 2
| jTextArea.setTransferHandler(new TransferHandler("foreground"));
|
程序 拖动颜色来改变文本前景色
下面程序可以直接把颜色选择器面板中的颜色拖放到指定文本域中,用以改变指定文本域的前景色。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import java.awt.*; import javax.swing.*;
public class TransferHandlerTest { private JFrame jf = new JFrame("测试TransferHandler"); JColorChooser chooser = new JColorChooser(); JTextArea txt = new JTextArea("测试TransferHandler\n" + "直接将上面颜色拖入以改变文本颜色");
public void init() { chooser.setDragEnabled(true); txt.setDragEnabled(true); jf.add(chooser, BorderLayout.SOUTH); txt.setTransferHandler(new TransferHandler("foreground")); jf.add(new JScrollPane(txt)); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.pack(); jf.setVisible(true); }
public static void main(String[] args) { new TransferHandlerTest().init(); } }
|
上面程序中的粗体字代码将JTextArea
的foreground
属性转换成拖放目标,它可以接收任何Color
对象。而JColorChooser
启动拖放功能后可以导出颜色对象的本地引用,从而可以直接将该颜色对象拖给JTextArea
的foreground
属性。运行上面程序,会看到如图12.22所示的界面。
从图12.22中可以看出,当用户把颜色选择器面板中预览区的颜色拖到上面多行文本域后,多行文本域的颜色也随之发生改变。