12.4 Swing简化的拖放功能

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)方法,这样即可利用TransferHandlerforeground定义成拖放目标。代码如下:

1
2
//允许直接将一个co1or对象拖入该 jTextArea对象,并赋给它的 foreground属性
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);
// 允许直接将一个Color对象拖入该JTextArea对象
// 并赋给它的foreground属性
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();
}
}

上面程序中的粗体字代码将JTextAreaforeground属性转换成拖放目标,它可以接收任何Color对象。而JColorChooser启动拖放功能后可以导出颜色对象的本地引用,从而可以直接将该颜色对象拖给JTextAreaforeground属性。运行上面程序,会看到如图12.22所示的界面。
这里有一张图片

从图12.22中可以看出,当用户把颜色选择器面板中预览区的颜色拖到上面多行文本域后,多行文本域的颜色也随之发生改变