В этой статье описан метод реализации Java с использованием буфера обмена для обмена данными между программами. В графических системах системный буфер обмена очень важен. Трудно представить, как можно было бы использовать графическую операционную систему без функции буфера обмена. В этом примере реализуется обмен данными между Java-программой и буфером обмена системы. При нажатии кнопки «Вставить» программа Java получает данные из системного буфера обмена и отображает их в компоненте JTextArea при нажатии кнопки «Копировать». После этого выделенный текст в текстовой области будет перенесен в системный буфер обмена.
Во-первых, вы должны получить ссылку на экземпляр системного буфера обмена. Класс java.awt.Toolkit предоставляет метод getSystemClipboard() для возврата экземпляра буфера обмена, и поскольку класс Toolkit предоставляет статический метод getDefaultToolkit() для возврата экземпляра Toolkit; нет необходимости создавать новый объект Toolkit, конкретный код реализации выглядит следующим образом:
Буфер обмена cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Здесь класс Clipboard предоставляет методы getContents() и setContents() для реализации обмена данными.
Transferable getContents (запросчик объекта); Void setContents (передаваемое содержимое, владелец ClipboardOwner);
Здесь метод getContents() получает объект Transferable из системного буфера обмена. Запрашивающий параметр представляет заявителя данных. Обычно этого достаточно, что указывает на то, что запрос данных является объектом экземпляра этого класса. Если требуемые данные являются текстовыми, вы можете вызвать getTransferData(DataFlavor.stringFlavor) объекта Transferable, чтобы получить их. Код реализации выглядит следующим образом:
Передаваемый tr = cb.getContents(this);String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
Метод setContents() передает данные из программы в системный буфер обмена. Содержимое параметра представляет данные, а владелец параметра представляет владельца буфера обмена.
StringSelection ss = new StringSelection(this.jTextArea1.getText());cb.setContents(ss,ss);
Класс StringSelection в приведенном выше операторе представляет выделенный текст.
Судя по приведенному выше анализу, фактически в системном буфере обмена хранится коллекция передаваемых объектов, а обмен данными между программой и системным буфером обмена представляет собой передачу передаваемых объектов. Код программы:
1. Создайте новый проект и назовите его JClipDemo.
2. Создайте новое приложение и назовите его JClipDemo; назовите главное окно MainFrame и назовите его JClipDemo.
3. Добавьте компонент JTextArea, два компонента JButton и компонент JPanel в окно дизайна класса MainFrame и поместите два компонента JButton в компонент JPanel. Добавить новое свойство Буфер обмена cb. Конкретный код выглядит следующим образом:
public class MainFrame расширяет JFrame {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();//Создаем новый компонент Private JTextArea jTextArea1 = new JTextArea();private JPanel jPanel1 = new JPanel();private JButton jButton1 = new JButton( );частная JButton jButton2 = новая JButton();//Clipboard экземплярClipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();……}
4. Напишите метод инициализации jbInit() класса MainFrame, выполните начальные настройки свойств каждого компонента и добавьте прослушиватель событий для компонента кнопки. Конкретный код выглядит следующим образом:
Private void jbInit() выдает исключение {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Ваш значок]")));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(новый java.awt.Font("Dialog", 0, 14));jButton2.setText("Вставить");jButton2.addActionListener(новый 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); //Получаем передаваемый объект из системного буфера обмена if (tr != null){String s = (String) tr.getTransferData(DataFlavor.stringFlavor) ); //Получаем текстовые данные из передаваемого объекта, если (s!=null)this.jTextArea1.insert(s,this.jTextArea1.getCaretPosition()); //Вставляем текст в позицию курсора в компоненте JTextArea.}}catch(Exception err){err.printStackTrace();} }