按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
作变得十分的优良。相反,如果我们打印而不是绘画,我们必须利用 RTTI instanceof 关键字(在本书 11 章
中有相应描述)来测试PrintGrapics,然后下溯造型并调用这独特的PrintGraphics 方法:getPrintJob()
方法。现在我们拥有PrintJob 的句柄并且我们可以发现纸张的高度和宽度。这是一种hacky 的方法,但也许
这对它来说是合理的理由。(在其它方面,到如今我们看到一些其它的库设计,因此,我们可能会得到设计
者们的想法。)
我们可以注意到Plot2 中的paint()绘画方法对打印和绘图的可能性进行审查。但是因为当打印时 Print()方
法将被调用,那么为什么不使用那种方法呢?这种方法同样也在Plot3 中也被使用,并且它消除了对
instanceof使用的需求,因为在 Print()方法中我们可以假设我们能对一个 PrintGraphics 对象造型。这样
也不坏。这种情况被放置公共绘画代码到一个分离的doGraphics()方法的办法所改进。
2。 在程序片内运行帧
如果我们想在一个程序片中打印会怎以样呢?很好,为了打印任何事物我们必须通过工具组件对象的
getPrintJob()方法拥有一个PrintJob 对象,设置唯一的一个帧对象而不是一个程序片对象。于是它似乎可
能从一个应用程序中打印,而不是从一个程序片中打印。但是,它变为我们可以从一个程序片中创建一个帧
(相反的到目前为止,我在程序片或应用程序例子中所做的,都可以生成程序片并安放帧。)。这是一个很
有用的技术,因为它允许我们在程序片中使用一些应用程序(只要它们不妨碍程序片的安全)。但是,当应
453
…………………………………………………………Page 455……………………………………………………………
用程序窗口在程序片中出现时,我们会注意到 WEB 浏览器插入一些警告在它上面,其中一些产生
“Warning:Applet Window。 (警告:程序片窗口)”的字样。
我们会看到这种技术十分直接的安放一个帧到程序片中。唯一的事是当用户关闭它时我们必须增加帧的代码
(代替调用System。exit() ):
//: PrintDemoApplet。java
// Creating a Frame from within an Applet
import java。applet。*;
import java。awt。*;
import java。awt。event。*;
public class PrintDemoApplet extends Applet {
public void init() {
Button b = new Button(〃Run PrintDemo〃);
b。addActionListener(new PDL());
add(b);
}
class PDL implements ActionListener {
public void actionPerformed(ActionEvent e) {
final PrintDemo pd = new PrintDemo();
pd。addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
pd。dispose();
}
});
pd。setSize(500; 500);
pd。show();
}
}
} ///:~
伴随Java 1。1 版的打印支持功能而来的是一些混乱。一些宣传似乎声明我们能在一个程序片中打印。但
Java 的安全系统包含了一个特点,可停止一个正在初始化打印工作的程序片,初始化程序片需要通过一个
Web 浏览器或程序片浏览器来进行。在写作这本书时,这看起来像留下了一个未定的争议。当我在WEB 浏览
器中运行这个程序时,printdemo (打印样本)窗口正好出现,但它却根本不能从浏览器中打印。
13。17。3 剪贴板
Java 1。1 对系统剪贴板提供有限的操作支持(在Java。awt。datatransfer package 里)。我们可以将字符串
作这文字对象复制到剪贴板中,并且我们可以从剪贴板中粘贴文字到字符中对角中。当然,剪贴板被设计来
容纳各种类型的数据,存在于剪贴板上的数据通过程序运行剪切和粘贴进入到程序中。虽然剪切板目前只支
持字符串数据,Java 的剪切板API 通过“特色”概念提供了良好的可扩展性。当数据从剪贴板中出来时,它
拥有一个相关的特色集,这个特色集可以被修改(例如,一个图形可以被表示成一些字符串或者一幅图像)
并且我们会注意到如果特殊的剪贴板数据支持这种特色,我们会对此十分的感兴趣。
下面的程序简单地对TextArea 中的字符串数据进行剪切,复制,粘贴的操作做了示范。我们将注意到的是我
们需要按照剪切、复制和粘贴的顺序进行工作。但如果我们看见一些其它程序中的TextField 或者
TextArea ,我们会发现它们同样也自动地支持剪贴板的操作顺序。程序中简单地增加了剪贴板的程序化控
制,如果我们想用它来捕捉剪贴板上的文字到一些非文字组件中就可以使用这种技术。
//: CutAndPaste。java
// Using the clipboard from Java 1。1
import java。awt。*;
import java。awt。event。*;
454
…………………………………………………………Page 456……………………………………………………………
import java。awt。datatransfer。*;
public class CutAndPaste extends Frame {
MenuBar mb = new MenuBar();
Menu edit = new Menu(〃Edit〃);
MenuItem
cut = new MenuItem(〃Cut〃);
copy = new MenuItem(〃Copy〃);
paste = new MenuItem(〃Paste〃);
TextArea text = new TextArea(20;20);
Clipboard clipbd =
getToolkit()。getSystemClipboard();
public CutAndPaste() {
cut。addActionListener(new CutL());
copy。addActionListener(new CopyL());
paste。addActionListener(new PasteL());
edit。add(cut);
edit。add(copy);
edit。add(paste);
mb。add(edit);
setMenuBar(mb);
add(text; BorderLayout。CENTER);
}
class CopyL implements ActionListener {
public void actionPerformed(ActionEvent e) {
String selection = text。getSelectedText();
StringSelection clipString =
new StringSelection(selection);
clipbd。setContents(clipString; clipString);
}
}
class CutL implements ActionListener {
public void actionPerformed(ActionEvent e) {
String selection = text。getSelectedText();
StringSelection clipString =
new StringSelection(selection);
clipbd。setContents(clipString; clipString);
text。replaceRange(〃〃;
text。getSelectionStart();
text。getSelectionEnd());
}
}
class PasteL implements ActionListener {
public void actionPerformed(ActionEvent e) {
Transferable clipData =
clipbd。getContents(CutAndPaste。this);
try {
String clipString =
(String)clipData。
getTransferData(
DataFlavor。stringFlavor);
text。replaceRange(clipString;
455
…………………………………………………………Page 457……………………………………………………………
text。getSelectionStart()