この記事では、クリップボードを使用してプログラム間でデータを交換する Java の実装方法について説明します。グラフィカル システムでは、システム クリップボードが非常に重要です。クリップボード機能のないグラフィカル オペレーティング システムがどのように使用されるかを想像するのは困難です。この例では、Java プログラムとシステムのクリップボード間のデータ交換を実現します。「貼り付け」ボタンがクリックされると、Java プログラムはシステムのクリップボードからデータを取得し、「コピー」ボタンがクリックされると、それを JTextArea コンポーネントに表示します。をクリックすると、テキストエリアで選択したテキストがシステムのクリップボードに転送されます。
まず、システム クリップボードへのインスタンス参照を取得する必要があります。java.awt.Toolkit クラスには、Clipboard インスタンスを返すための getSystemClipboard() メソッドが用意されており、Toolkit クラスには、Toolkit インスタンスを返すための静的メソッド getDefaultToolkit() が用意されています。新しい Toolkit オブジェクトを作成する必要はありません。具体的な実装コードは次のとおりです。
クリップボード cb = Toolkit.getDefaultToolkit().getSystemClipboard();
ここで、Clipboard クラスは、データ交換を実装するための getContents() メソッドと setContents() メソッドを提供します。
Transferable getContents(Object requester);Void setContents(Transferable content, ClipboardOwner owner);
ここでの getContents() メソッドは、システム クリップボードから Transferable オブジェクトを取得します。通常、パラメータ リクエスタはデータ申請者を表し、データのリクエストがこのクラスのインスタンス オブジェクトであることを示します。必要なデータがテキストの場合、Transferable オブジェクトの getTransferData(DataFlavor.stringFlavor) を呼び出して取得できます。実装コードは次のとおりです。
転送可能 tr = cb.getContents(this);String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
setContents() メソッドは、プログラムからシステム クリップボードにデータを転送します。パラメータの内容はデータを表し、パラメータの所有者はクリップボードの所有者を表します。
StringSelection ss = new StringSelection(this.jTextArea1.getText());cb.setContents(ss,ss);
上記のステートメントの StringSelection クラスは、選択されたテキストを表します。
上記の分析から、実際には、システム クリップボードには Transferable オブジェクトのコレクションが格納されており、プログラムとシステム クリップボード間のデータ交換は Transferable オブジェクトの転送であることがわかります。プログラムコード:
1.新しいプロジェクトを作成し、JClipDemo という名前を付けます。
2.新しいアプリケーションを作成し、JClipDemo という名前を付けます。メイン ウィンドウに MainFrame という名前を付け、JClipDemo というタイトルを付けます。
3. JTextArea コンポーネント、2 つの JButton、および JPanel コンポーネントを MainFrame クラスのデザイン ウィンドウに追加し、2 つの JButton コンポーネントを JPanel コンポーネント上に配置します。新しいプロパティ Clipboard cb を追加します。具体的なコードは次のとおりです。
public class MainFrame extends JFrame {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();//新しいコンポーネントを作成 private JTextArea jTextArea1 = new JTextArea();private JPanel jPanel1 = new JPanel();private JButton jButton1 = new JButton( );private JButton jButton2 = 新しいJButton();//クリップボード インスタンスClipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();……}
4. MainFrameクラスの初期化メソッドjbInit()を記述し、各コンポーネントの初期プロパティ設定を完了し、ボタンコンポーネントのイベントリスナーを追加します。具体的なコードは次のとおりです。
private void jbInit() は例外をスローします {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(new Dimension(396, 203));this.setTitle("JClipboardDemo");jButton1.setFont(new java.awt.Font("Dialog", 0, 14));jButton1.setText("Copy");jButton1.addActionListener(new java. awt.event.ActionListener() { //イベントリスナーを追加 public void actionPerformed(ActionEvent e) {jButton1_actionPerformed(e);}});jButton2.setFont(new java.awt.Font("Dialog", 0, 14));jButton2.setText("Paste");jButton2.addActionListener(new java.awt .event.ActionListener() {//イベント リスナーを追加 public void actionPerformed(ActionEvent e) {jButton2_actionPerformed(e);}});contentPane.add(jTextArea1, BorderLayout.CENTER);contentPane.add(jPanel1, BorderLayout.SOUTH);jPanel1.add(jButton1, null);jPanel1.add(jButton2, null); }
5.システムのクリップボードにデータを送信するための「コピー」ボタンのイベント処理メソッドを記述します。
void jButton1_actionPerformed(ActionEvent e) {StringSelection ss = new StringSelection(this.jTextArea1.getText()) //選択したテキストをシステム クリップボードに送信します cb.setContents(ss,ss);}
6.システムクリップボードからデータを取得する「貼り付け」ボタンのイベント処理メソッドを記述します。
void jButton2_actionPerformed(ActionEvent e) {try{Transferable tr = cb.getContents(this); //システム クリップボードから Transferable オブジェクトを取得 if (tr != null){String s = (String) tr.getTransferData(DataFlavor.stringFlavor) ); // Transferable オブジェクトからテキスト データを取得する(s!=null)this.jTextArea1.insert(s,this.jTextArea1.getCaretPosition()); //JTextArea コンポーネントのカーソル位置にテキストを挿入します}}catch(Exception err){err.printStackTrace();} }