Clipboard überschreiben?

Jinnai4

Mitglied
Hallo !
Bräuchte bitte mal wieder Hilfe 🙄

Erstelle gerade ein Programm mit GUI, welches in einem PDF die Felder ausfüllen soll.
D.h. ich würde gerne die eingegeben Texte des GUI nacheinander auslesen, kopieren und dann in dem PDF einfügen.
Klappt soweit auch, außer ,dass ich immer den zuletzt kopierten Text habe, auch, wenn ich vorher schon einfüge.
Zuletzt habe ich es noch mit einer schleife zu lösen, gibt aber auch nur das letzte Feld aus.
Bevor ich weiter herumprobiere, dachte ich ,ich frage mal nach ^^
Gibt es da bitte eine Möglichkeit?

Vielen Dank
🙂

Code:
    public void eingabe() {
        try {

            Robot robot = new Robot();
            String f1 = feld1.getText();
            String f2 = feld2.getText();
            String f3 = feld3.getText();

            Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

            StringSelection sS1 = new StringSelection(f1);
            StringSelection sS2 = new StringSelection(f2);
            StringSelection sS3 = new StringSelection(f3);

            clipboard.setContents(sS1, null);

            do {
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);
                clipboard.setContents(sS2, null);

            } while (clipboard.getContents(clipboard) == sS1);

            do {
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);
                clipboard.setContents(sS3, null);

            } while (clipboard.getContents(clipboard) == sS2);

            ausfuehren.setEnabled(true);

        } catch (AWTException e) {
            e.printStackTrace();
        }
    }
 
Moin, machen wir es kurz und schmerzlos
Java:
try {
    Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
    StringSelection selection;
    selection = new StringSelection("Hallo");
    c.setContents(selection, selection);
    Transferable t = c.getContents(null);
    if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        Object o = t.getTransferData(DataFlavor.stringFlavor);
        String data = (String) t.getTransferData(DataFlavor.stringFlavor);
        System.out.println("Clipboard contents: " + data);
    }
} catch (HeadlessException headlessException) {
} catch (UnsupportedFlavorException unsupportedFlavorException) {
} catch (IOException ioException) {
}

ja du kannst den clipboard content überschreiben....

Wenn man den obigen Code ausführt dann steht "Hallo" im clipboard - hth. 🙂
 
Hey, habs jetzt grad probiert.
Der Text scheint richtig kopiert zu sein, aber im PDF wird nur die zweite Kopie erstellt
d.h. eigentlich sollte "TEXT TEXT2" stehen, aber es steht nur " TEXT2".
In der Console steht aber :
Clipboard contents: TEXT
Clipboard contents: TEXT2
Übersehe ich da was oder habe ich was falsch gemacht?
Frohes neues btw 😀

Code:
    public void eingabe() throws AWTException {

        try {

            Robot robot = new Robot();

            String f1 = feld1.getText();
            String f2 = feld2.getText();
            String f3 = feld3.getText();

            Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();

            StringSelection selection, selection2;

            selection = new StringSelection(f1);
            selection2 = new StringSelection(f2);

            c.setContents(selection, selection);
            Transferable t = c.getContents(null);

            if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                Object o = t.getTransferData(DataFlavor.stringFlavor);
                String data = (String) t.getTransferData(DataFlavor.stringFlavor);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);

                System.out.println("Clipboard contents: " + data);
            }

            c.setContents(selection2, selection2);
            t = c.getContents(null);

            if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                Object o = t.getTransferData(DataFlavor.stringFlavor);
                String data = (String) t.getTransferData(DataFlavor.stringFlavor);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);

                System.out.println("Clipboard contents: " + data);
            }

        } catch (HeadlessException headlessException) {
        } catch (UnsupportedFlavorException unsupportedFlavorException) {
        } catch (IOException ioException) {
        }
    }
 
pdf?
...Ich glaube, das könnte 123 mögliche Fehlerursachen haben was der Code macht. Wenn ich es richtig sehe dann kopierst du Zeichenketten "in ein anderes Fenster". Wieso schreibst du nicht einfach in das andere Fenster? Warum der "Umweg" über den clipboard content? Das würd man so nicht machen.
Dir auch frohes Neues.
 
Das Programm soll die Arbeit erleichtern, da ich mehrmals am Tag dasselbe PDF ausfüllen muss, aber es nicht möglich ist Grunddaten zu speichern.
Ursprünglich war es so geplant, dass im Programm über Textfelder Werte eingegeben werden und diese per Start Button in die PDF übertragen werden sollen.
Habe einige Themen dazu durchforstet und immer wieder gehört, dass das mit Java nicht möglich ist.
Daher dachte ich (zumindest meiner Theorie nach), dann bau ich einfach einen Timer ein, ich klick das erste Feld im PDF an und dann soll er den Inhalt per "Copy&Paste" und mit "Tab" ausfüllen.
Hier der komplette Code, falls es hilf :

Code:
package at.jinnai;

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException {
        Fenster fenster = new Fenster();
        fenster.check();

    }

}
Code:
package at.jinnai;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.Timer;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class Fenster extends javax.swing.JFrame implements ActionListener {

    private static final long serialVersionUID = -2591364083253132185L;

    private Toolkit t;
    private int x = 0, y = 0, width = 300, height = 300;
    private Toolkit T;
    private int b = 0, h = 0, br = 300, ho = 100;
    Container cp = getContentPane();

    String Feld1;
    String Feld2;
    String Feld3;
    String Zeit;

    final static int intervall = 250;
    int inter;
    Timer timer;
    JProgressBar prg;
    private JMenuBar bar1;

    private JMenu bar1_menu1;

    private JMenuItem bar1_menu1_menuitem1;
    private JMenuItem bar1_menu1_menuitem2;

    private JTextField feld1 = new JTextField();
    private JTextField feld2 = new JTextField();
    private JTextField feld3 = new JTextField();
    private JTextField zeit = new JTextField();

    private JLabel balken = new JLabel("Erstelle Ordner");
    private JLabel label1 = new JLabel("Feld 1");
    private JLabel label2 = new JLabel("Feld 2");
    private JLabel label3 = new JLabel("Feld 3");
    private JLabel lzeit = new JLabel("Verzögerung :");

    private JButton ausfuehren = new JButton("Ausführen");
    private JButton speichern = new JButton("Speichern");

    public Fenster() {
        cp.setLayout(null);

        t = Toolkit.getDefaultToolkit();
        T = Toolkit.getDefaultToolkit();

        Dimension d = t.getScreenSize();
        x = (int) ((d.getWidth() - width) / 2);
        y = (int) ((d.getHeight() - height) / 2);

        setResizable(false);
        setTitle("Writefox");
        setBounds(x, y, width, height);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        feld1.setBounds(15, 40, 265, 20);
        label1.setBounds(15, 20, 100, 20);
        cp.add(feld1);
        cp.add(label1);

        feld2.setBounds(15, 80, 265, 20);
        label2.setBounds(15, 60, 100, 20);
        cp.add(feld2);
        cp.add(label2);

        feld3.setBounds(15, 120, 265, 20);
        label3.setBounds(15, 100, 100, 20);
        cp.add(feld3);
        cp.add(label3);

        zeit.setBounds(220, 5, 60, 20);
        lzeit.setBounds(130, 5, 100, 20);
        zeit.setText("2");
        zeit.setInputVerifier(new InputVerifier() {
            public boolean verify(JComponent input) {
                String str = ((JTextField) input).getText();
                if (str.equals(""))
                    return true;
                return str.matches("[.0-9]*");
            }
        })

        ;
        cp.add(zeit);
        cp.add(lzeit);

        ausfuehren.setBounds(15, 160, 150, 20);
        cp.add(ausfuehren);

        speichern.setBounds(15, 200, 150, 20);
        cp.add(speichern);

        // stop.setBounds(180, 160, 100, 60);

        this.initComponents();
        this.initListeners();

        setVisible(true);
    }

    private void initComponents()

    {
        this.getContentPane().setLayout(null);
        this.bar1 = new JMenuBar();
        this.bar1_menu1 = new JMenu("Ansicht");

        this.bar1_menu1_menuitem1 = new JMenuItem("Entwickler");
        this.bar1_menu1_menuitem2 = new JMenuItem("Hilfe");
        this.setJMenuBar(this.bar1);

        this.bar1.add(this.bar1_menu1);
        this.bar1_menu1.add(this.bar1_menu1_menuitem1);
        this.bar1_menu1.add(this.bar1_menu1_menuitem2);

    }

    public class Dialog extends JDialog {

        private static final long serialVersionUID = 1L;

        public Dialog(Fenster f) {
            super();
            setTitle("Bedienung");
            setResizable(true);
            setModal(true);
            Font font = new Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 16);

            JTextPane hilfe = new JTextPane();
            hilfe.setText("XXX");

            SimpleAttributeSet fetbu = new SimpleAttributeSet();
            SimpleAttributeSet fett = new SimpleAttributeSet();

            StyleConstants.setForeground(fetbu, Color.RED);

            StyleConstants.setBold(fett, true);
            StyleConstants.setUnderline(fett, true);

            hilfe.setEditable(false);
            hilfe.setFont(font);
            hilfe.setBackground(getContentPane().getBackground());

            add(hilfe);

            pack();
        }

    }

    private void initListeners() {

        this.bar1_menu1_menuitem1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)

            {
                JTextPane entwickler = new JTextPane();
                entwickler.setText("Jakob R.\nJänner 2019\n");
                entwickler.setEditable(false);
                entwickler.setBackground(Color.lightGray);

                JOptionPane.showMessageDialog(null, entwickler, "Der, welcher zuviel Zeit hatte",
                        JOptionPane.INFORMATION_MESSAGE);
            }
        });

        this.bar1_menu1_menuitem2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)

            {
                Dialog dialog = new Dialog(Fenster.this);
                dialog.setLocationRelativeTo(Fenster.this);
                dialog.setVisible(true);
            }
        });

        this.ausfuehren.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)

            {
                try {
                    if (feld1.getText().isEmpty() || feld2.getText().isEmpty() || feld3.getText().isEmpty()) {
                        JOptionPane.showMessageDialog(null, "Bitte alle Felder ausfüllen !", "Fehler",
                                JOptionPane.ERROR_MESSAGE);
                    } else if (zeit.getText().equals("") || !(Pattern.matches("^[0-9]+$", zeit.getText()))) {
                        JOptionPane.showMessageDialog(null, "Bitte gültigen Wert bei \"Verzögerung\" eintragen !",
                                "Fehler", JOptionPane.ERROR_MESSAGE);
                    }

                    else {

                        ausfuehren.setEnabled(false);

                        try {
                            String verzogerung = zeit.getText().toString();
                            long zeit = Long.parseLong(verzogerung);

                            TimeUnit.SECONDS.sleep(zeit);
                            try {
                                eingabe();
                            } catch (AWTException e1) {

                                e1.printStackTrace();
                            }
                        } catch (InterruptedException e1) {

                            e1.printStackTrace();
                        }

                    }
                } catch (NumberFormatException ex)

                {
                    JOptionPane.showMessageDialog(null, "Keine zulässige Zahl", "Fehler", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        this.speichern.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)

            {
                try {
                    if (feld1.getText().isEmpty() || feld2.getText().isEmpty() || feld3.getText().isEmpty()) {
                        JOptionPane.showMessageDialog(null, "Bitte alle Felder ausfüllen !", "Fehler",
                                JOptionPane.ERROR_MESSAGE);
                    } else if (zeit.getText().equals("") || !(Pattern.matches("^[0-9]+$", zeit.getText()))) {
                        JOptionPane.showMessageDialog(null, "Bitte gültigen Wert bei \"Verzögerung\" eintragen !",
                                "Fehler", JOptionPane.ERROR_MESSAGE);
                    }

                    else {

                        try {
                            speichern();
                        } catch (IOException e1) {

                            e1.printStackTrace();
                        }

                    }

                } catch (NumberFormatException ex)

                {
                    JOptionPane.showMessageDialog(null, "Keine zulässige Zahl", "Fehler", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }

    public void actionPerformed(ActionEvent e) {

    }

    public void check() throws IOException {
        String userHomeFolder = System.getProperty("user.home");
        File writefoxordner = new File(userHomeFolder, "Writefox");
        File writefox = new File(writefoxordner, "Daten.properties");
        Properties props = new Properties();

        if (!writefox.exists()) {
            start();
        } else {
            InputStream in = new FileInputStream(writefox);
            props.load(in);

            feld1.setText(props.getProperty("F1"));
            feld2.setText(props.getProperty("F2"));
            feld3.setText(props.getProperty("F3"));
            zeit.setText(props.getProperty("Z"));
        }
    }

    public void start() throws IOException {
        String userHomeFolder = System.getProperty("user.home");
        File writefoxordner = new File(userHomeFolder, "Writefox");
        File writefox = new File(writefoxordner, "Daten.properties");
        Properties props = new Properties();

        Feld1 = "TEXT";
        Feld2 = "TEXT";
        Feld3 = "TEXT";
        Zeit = "2";

        props.setProperty("F1", Feld1);
        props.setProperty("F2", Feld2);
        props.setProperty("F3", Feld3);
        props.setProperty("Z", Zeit);

        if (writefoxordner.exists()) {
            OutputStream out = new FileOutputStream(writefox);
            props.store(out, "Properties");
            check();
        } else {
            JFrame frame = new JFrame();
            frame.setLayout(new FlowLayout());
            frame.add(balken);
            frame.setResizable(false);
            frame.setTitle("Bereite vor...");
            Dimension d = T.getScreenSize();
            b = (int) ((d.getWidth() - br) / 2);
            h = (int) ((d.getHeight() - ho) / 2);

            frame.setBounds(b, h, br, ho);
            frame.setVisible(true);
            inter = 0;
            prg = new JProgressBar(0, 20);
            prg.setValue(0);
            prg.setStringPainted(true);
            frame.add(prg);
            writefoxordner.mkdir();

            timer = new Timer(intervall, new ActionListener() {

                public void actionPerformed(ActionEvent e) {

                    if (inter == 20) {
                        timer.stop();

                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }

                        ausfuehren.setEnabled(true);
                        speichern.setEnabled(true);

                        frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                        try {
                            start();

                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }

                    }

                    else {
                        ausfuehren.setEnabled(false);
                        speichern.setEnabled(false);

                        inter++;
                        prg.setValue(inter);
                    }

                }

            });
            timer.start();
        }

    }

    public void speichern() throws IOException {

        String userHomeFolder = System.getProperty("user.home");
        File writefoxordner = new File(userHomeFolder, "Writefox");
        File writefox = new File(writefoxordner, "Daten.properties");
        Properties props = new Properties();

        try {
            Feld1 = feld1.getText();
            Feld2 = feld2.getText();
            Feld3 = feld3.getText();
            Zeit = zeit.getText();
        } catch (NullPointerException e) {
            Feld1 = "TEXT EINGEBEN";
            Feld2 = "TEXT EINGEBEN";
            Feld3 = "TEXT EINGEBEN";
            Zeit = "2";
            JOptionPane.showMessageDialog(null, "Es wurden nicht alle Felder ausgefüllt", "Fehler",
                    JOptionPane.ERROR_MESSAGE);
        }
        props.setProperty("F1", Feld1);
        props.setProperty("F2", Feld2);
        props.setProperty("F3", Feld3);
        props.setProperty("Z", Zeit);
        OutputStream out = new FileOutputStream(writefox);
        props.store(out, "Properties");

    }

    public void eingabe() throws AWTException {

        try {

            Robot robot = new Robot();

            String f1 = feld1.getText();
            String f2 = feld2.getText();
            String f3 = feld3.getText();

            Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();

            StringSelection selection, selection2;

            selection = new StringSelection(f1);
            selection2 = new StringSelection(f2);

            c.setContents(selection, selection);
            Transferable t = c.getContents(null);

            if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                Object o = t.getTransferData(DataFlavor.stringFlavor);
                String data = (String) t.getTransferData(DataFlavor.stringFlavor);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);

                System.out.println("Clipboard contents: " + data);
            }

            c.setContents(selection2, selection2);
            t = c.getContents(null);

            if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                Object o = t.getTransferData(DataFlavor.stringFlavor);
                String data = (String) t.getTransferData(DataFlavor.stringFlavor);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);

                System.out.println("Clipboard contents: " + data);
            }

        } catch (HeadlessException headlessException) {
        } catch (UnsupportedFlavorException unsupportedFlavorException) {
        } catch (IOException ioException) {
        }
    }

}
 
Nicht schön, aber selten:
Java:
    private Runnable paste(final Robot robot, final StringSelection sel) {
        return new Runnable() {
            @Override
            public void run() {
                try { Thread.sleep(100); } catch (InterruptedException ex) {}
                Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                c.setContents(sel, sel);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                try { Thread.sleep(100); } catch (InterruptedException ex) {}
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);
            }
        };
    }
    
    public void eingabe() throws AWTException {
        try {
            Robot robot = new Robot();

            String f1 = feld1.getText();
            String f2 = feld2.getText();
            String f3 = feld3.getText();

            SwingUtilities.invokeLater(paste(robot, new StringSelection(f1)));
            SwingUtilities.invokeLater(paste(robot, new StringSelection(f2)));
        } catch (Exception ex) { ex.printStackTrace(); }
    }
 
Nicht schön, aber selten:
Java:
    private Runnable paste(final Robot robot, final StringSelection sel) {
        return new Runnable() {
            @Override
            public void run() {
                try { Thread.sleep(100); } catch (InterruptedException ex) {}
                Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                c.setContents(sel, sel);
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                try { Thread.sleep(100); } catch (InterruptedException ex) {}
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_TAB);
                robot.keyRelease(KeyEvent.VK_TAB);
            }
        };
    }
  
    public void eingabe() throws AWTException {
        try {
            Robot robot = new Robot();

            String f1 = feld1.getText();
            String f2 = feld2.getText();
            String f3 = feld3.getText();

            SwingUtilities.invokeLater(paste(robot, new StringSelection(f1)));
            SwingUtilities.invokeLater(paste(robot, new StringSelection(f2)));
        } catch (Exception ex) { ex.printStackTrace(); }
    }

Vielen Dank !
Das hat funktioniert 😀
Muss ich mir dann später noch näher anschauen
lg und schöne Woche noch
 

Zurück
Oben