假设我们在JPanel中有两个JTextArea,我希望用户能够在一个选择中使用鼠标选择跨越这两个JTextArea的文本,是否可以在Swing中使用?
问候
到目前为止我尝试过:
我尝试将mouselistener添加到这些JTextArea,当mouseEnter时,我在TextArea中选择文本,并以实用方式突出显示文本.这既困难又容易出错,我想也许有更好的方法
编辑:
感谢所有的答案和建议.根据答案,我实施了一个基本的解决方案,并将其作为其他人参考的答案.:)
当用户在第二个文本中选择文本时,第一个文本区域中的文本保持选中状态(文本在高亮显示)
我假设您的意思是用户在两个不同的文本区域中选择不同的文本.
默认情况下,文本组件仅在文本组件具有焦点时显示所选文本.
简单的答案是创建一个自定义Caret并覆盖该focusLost(...)
方法并setSelectionVisible(true)
在方法结束时调用,以确保即使文本组件没有焦点也会绘制选择.
以下是该方法的更高版本,允许您为没有焦点的文本组件指定不同的选择背景颜色(如果您愿意):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class SelectionCaret extends DefaultCaret
{
private static final Color SELECTION_COLOR = UIManager.getColor("TextField.selectionBackground");
private Highlighter.HighlightPainter focusedPainter;
private Highlighter.HighlightPainter unfocusedPainter;
public SelectionCaret()
{
this(SELECTION_COLOR);
}
public SelectionCaret(Color unfocusedColor)
{
focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(SELECTION_COLOR);
unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(unfocusedColor);
setBlinkRate( UIManager.getInt("TextField.caretBlinkRate") );
}
@Override
protected Highlighter.HighlightPainter getSelectionPainter()
{
return getComponent().hasFocus() ? focusedPainter : unfocusedPainter;
}
@Override
public void focusGained(FocusEvent e)
{
setSelectionVisible(false);
super.focusGained(e);
}
@Override
public void focusLost(FocusEvent e)
{
super.focusLost(e);
setSelectionVisible(true);
}
private static void createAndShowUI()
{
JTextField textField1 = new JTextField("Text Field1 ");
JTextField textField2 = new JTextField("Text Field2 ");
JTextField textField3 = new JTextField("Non Editable ");
textField3.setEditable(false);
textField1.setCaret(new SelectionCaret());
textField2.setCaret(new SelectionCaret());
textField3.setCaret(new SelectionCaret());
textField1.select(5, 11);
textField2.select(5, 11);
textField3.select(5, 11);
((DefaultCaret)textField1.getCaret()).setSelectionVisible(true);
((DefaultCaret)textField2.getCaret()).setSelectionVisible(true);
((DefaultCaret)textField3.getCaret()).setSelectionVisible(true);
JPanel north = new JPanel();
north.add( new JTextField("Text Field0 ") );
north.add(textField1);
north.add(textField2);
north.add(textField3);
JFrame frame = new JFrame("Selection Caret");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( north );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码基于mKorbel在此帖子中提供的代码.
归档时间: |
|
查看次数: |
1058 次 |
最近记录: |