Как я могу выделить текст в двух разных JTextField?

#java #swing #jtextfield

#java #swing #jtextfield

Вопрос:

Допустим, у меня есть этот код:

   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);
  }
  

Я хотел бы выделить текст в обоих полях text1 и text2, чтобы я мог скопировать их оба одновременно. Но когда я запускаю приложение, я могу одновременно выбирать текст только из 1 текстового поля. Как я могу сделать так, чтобы я мог выделять текст поверх всех текстовых полей, которые могут быть у меня в программе?

Комментарии:

1. Хороший вопрос, но я, честно говоря, не верю, что это возможно с использованием стандартных компонентов.

2. Вы говорите о том, что когда вы выбираете определенный диапазон текста в одном поле, вы хотите, чтобы этот диапазон выбора применялся ко всем другим полям?

3. @izuriel нет, я бы хотел, чтобы два поля действовали так, как если бы все они были одним текстовым полем, где я мог бы периодически выбирать текст между ними, не беспокоясь о границах, где одно текстовое поле останавливается / заканчивается, мешая.

4. Англ. Ответ Фуада решил эту проблему, если я правильно понимаю. Я сделал почти то же самое, что и он (он опередил меня в ответе), и когда я нажал кнопку копирования, она извлекла оба фрагмента текста — на самом деле это довольно просто.

5. @izuriel да, но проблема в моем приложении, на самом деле, не имеет смысла размещать кнопку копирования где-либо рядом с текстом. Я думаю, проблема в том, что я просто не могу сделать то, что я хочу сделать в этой ситуации.

Ответ №1:

Как насчет того, чтобы JButton скопировать объединение обоих JTextField полей?

Например:

 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);
    }
});
  

Ответ №2:

Я думаю, что getSelectedText() может это сделать

введите описание изображения здесь

 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();
            }
        });
    }
}
  

Ответ №3:

Публикую это как ответ:

Вы можете изучить изменение функциональности в JTextComponent s copy() , paste() и cut() методах, чтобы изменить способ, которым они работают для этого компонента.

Недостатком этого подхода является то, что если вы измените способ copy() работы — пользователь никогда не получит ожидаемых результатов при попытке скопировать выделение из одного JTextField . Способ решить эту проблему — внедрить новую привязку клавиш для компонента. Вот пример замены кнопки «Копировать» привязкой клавиш «Ctrl-G».

 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);
    }
}
  

Ответ №4:

Я так не думаю. Но вы могли бы программно добавить прослушиватель горячих клавиш, который мог бы добавлять весь текст в буфер обмена.

http://www.javapractices.com/topic/TopicAction.do?Id=82 http://blogs.oracle.com/JavaFundamentals/entry/transferring_text_through_the_clipboard

Ответ №5:

Может быть, вы можете использовать JTable вместо JTextFields?

 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);
  

JTable позволит вам выбирать и копировать из нескольких ячеек.