Java 如何在两个不同的JTextField上选择文本?
假设我有以下代码:Java 如何在两个不同的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
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个文本字段中选择文本。我怎样才能在程序中的所有文本字段中选择文本?我不这么认为。但是您可以通过编程方式添加热键侦听器,该侦听器可以附加所有文本并将其添加到剪贴板 http://blogs.oracle.com/JavaFundamentals/entry/transferring_text_through_the_clipboard制作一个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);
}
});
也许您可以使用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允许您从多个单元格中选择和复制。我认为这可以做到
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();
}
});
}
}
将此作为答案发布: 您可以研究更改JTextComponents复制、粘贴和剪切方法中的功能,以改变它们对该组件的工作方式 这种方法的缺点是,如果你改变了复制的工作方式——当用户试图从一个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);
}
}
好问题,但我真的不相信使用标准组件是可能的。你是说,当你在一个字段中选择某个文本范围时-你想将该选择范围应用于所有其他字段吗?@izuriel不,我希望这两个字段的作用就像它们都是一个文本字段一样,在这里,我可以在两个文本之间断断续续地选择文本,而不必担心一个文本字段停止/结束的边界会造成阻碍。如果我理解正确的话,Eng.Fouad的答案解决了这个问题。我和他做了同样的事情,他抢先回答了我,当我点击“复制”按钮时,它拉出了两段文本——这真的很简单。@izuriel是的,但问题是在我的应用程序中,在文本附近有一个复制按钮真的没有意义。我想问题是在这种情况下我不能做我想做的事。