4 Stimmen

Wie kann ich Text über zwei verschiedene JTextFields auswählen?

Sagen wir, ich habe diesen Code:

  public static void main(final String [] args)
  {
    final JFrame frame = new JFrame("Display Keyword Panel");
    final JPanel panel = new JPanel(new BorderLayout());

    JTextField text1 = new JTextField("This is the first text field");
    text1.setBorder(null);
    text1.setOpaque(false);
    text1.setEditable(false);

    JTextField text2 = new JTextField("This is the second text field");
    text2.setBorder(null);
    text2.setOpaque(false);
    text2.setEditable(false);

    panel.add(text1, BorderLayout.NORTH);
    panel.add(text2, BorderLayout.SOUTH);

    frame.setLayout(new BorderLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    frame.setLocation(450, 400);
    frame.pack();
    frame.setVisible(true);
  }

Ich möchte Text über den beiden Feldern text1 und text2 auswählen, damit ich beide gleichzeitig kopieren kann. Aber wenn ich die Anwendung ausführe, kann ich immer nur den Text aus einem Textfeld auswählen. Wie kann ich es so einrichten, dass ich Text in allen Textfeldern auswählen kann, die ich in meinem Programm habe?

0 Stimmen

@izuriel nein, ich möchte, dass sich die beiden Felder so verhalten, als wären sie ein einziges Textfeld, in dem ich den Text abwechselnd zwischen den beiden auswählen kann, ohne dass ich mir Sorgen machen muss, dass die Grenzen des einen Textfeldes im Weg sind.

1 Stimmen

Die Antwort von Eng.Fouad hat das Problem gelöst, wenn ich das richtig verstanden habe. Ich habe das Gleiche getan wie er (er war schneller als ich) und als ich auf die Schaltfläche "Kopieren" drückte, wurden beide Textteile übernommen - das ist wirklich ganz einfach.

0 Stimmen

@izuriel ja, aber das Problem ist, dass es in meiner Anwendung wirklich keinen Sinn macht, eine Kopierschaltfläche irgendwo in der Nähe des Textes zu haben. Ich denke, das Problem ist, dass ich in dieser Situation einfach nicht das tun kann, was ich tun möchte.

3voto

Eng.Fouad Punkte 110730

Wie wäre es mit einem JButton um die Verkettung von beidem zu kopieren JTextField 's?

Zum Beispiel:

btn.setActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        java.awt.datatransfer.StringSelection strsel = new java.awt.datatransfer.StringSelection(textField1.getText() + textField2.getText());
        java.awt.datatransfer.Clipboard clbrd = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
        clbrd.setContents(strsel, strsel);
    }
});

1voto

mKorbel Punkte 109073

Ich denke, dass getSelectedText( ) kann das tun

enter image description here

import java.awt.event.*;
import javax.swing.*;

public class CaretPositionTest {

    public CaretPositionTest() {
        final JTextField textField = new JTextField("0123456789");
        final JTextField textField1 = new JTextField("0123456789");
        textField.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {
            }

            @Override
            public void focusLost(FocusEvent e) {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        textField1.setText(textField.getSelectedText());
                    }
                });
            }
        });
        JPanel p = new JPanel();
        p.add(textField);
        p.add(textField1);
        JButton b;
        p.add(b = new JButton(new AbstractAction("0->5") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                textField.select(5, textField.getText().length());
                textField.setCaretPosition(5);
                textField.moveCaretPosition(textField.getText().length());
            }
        }));
        b.setFocusable(false);
        p.add(b = new JButton(new AbstractAction("5->0") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                textField.setCaretPosition(5);
                textField.moveCaretPosition(0);
            }
        }));
        b.setFocusable(false);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CaretPositionTest();
            }
        });
    }
}

1voto

Brandon Buck Punkte 7051

Ich poste dies als Antwort:

Sie können prüfen, ob Sie die Funktionalität in JTextComponent s copy() , paste() y cut() Methoden, um ihre Funktionsweise für diese Komponente zu ändern.

Der Nachteil dieses Ansatzes ist, dass Sie die Art und Weise, wie Sie copy() funktioniert - der Benutzer wird nie die Ergebnisse erhalten, die er erwartet, wenn er versucht, eine Auswahl aus einer einzelnen JTextField . Die Lösung für dieses Problem ist die Implementierung einer neuen KeyBinding für die Komponente. Hier ein Beispiel, bei dem die Schaltfläche "Kopieren" durch eine KeyBinding "Strg-G" ersetzt wird.

public class Test {
    public static JTextField text1 = new JTextField("This is the first text field");
    public static JTextField text2 = new JTextField("This is the second text field");

    public static void main(final String [] args)
    {
        final JFrame frame = new JFrame("Display Keyword Panel");
        final JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        text1.setBorder(null);
        text1.setOpaque(false);
        text1.setEditable(false);

        text2.setBorder(null);
        text2.setOpaque(false);
        text2.setEditable(false);

        text1.getInputMap().put(KeyStroke.getKeyStroke('G', KeyEvent.CTRL_DOWN_MASK), "copyAll");
        text1.getActionMap().put("copyAll", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                StringBuilder s = new StringBuilder();
                s.append(text1.getText()).append("\n").append(text2.getText());
                System.out.println(s.toString());
            }
        });

        panel.add(text1);
        panel.add(text2);

        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        frame.setLocation(450, 400);
        frame.pack();
        frame.setVisible(true);
    }
}

0voto

John B Punkte 31552

Das glaube ich nicht. Aber Sie könnten einen Hotkey-Listener programmatisch hinzufügen, der den gesamten Text anhängt und in die Zwischenablage kopiert.

http://www.javapractices.com/topic/TopicAction.do?Id=82 http://blogs.oracle.com/JavaFundamentals/entry/transferring\_text\_through\_the\_clipboard

0voto

dogbane Punkte 253146

Vielleicht können Sie eine JTable anstelle von JTextFields verwenden?

final JTable table = new JTable(2,1);
table.setValueAt("This is the first text field", 0, 0);
table.setValueAt("This is the second text field", 1, 0);

Mit einer JTable können Sie mehrere Zellen auswählen und kopieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X