Java 失去焦点后,jTextArea停止在文本上显示突出显示

Java 失去焦点后,jTextArea停止在文本上显示突出显示,java,swing,jtextcomponent,swing-highlighter,Java,Swing,Jtextcomponent,Swing Highlighter,当我的jTextArea处于焦点时,它允许文本高亮显示,但当它失去焦点时,它不会显示文本选择。即使用户将焦点移动到相关jFrame上的另一个组件,也可以继续显示文本高亮显示吗 但当焦点松开时,不会在文本上显示所选内容 有三种方法: 使用 最简单的情况是,我们将选择视为从鼠标事件绘制人工制品,请参见我的问题“如何覆盖” 或以编程方式覆盖荧光灯 导入java.awt.BorderLayout; 导入java.awt.event.ActionEvent; 导入java.awt.event.

当我的jTextArea处于焦点时,它允许文本高亮显示,但当它失去焦点时,它不会显示文本选择。即使用户将焦点移动到相关jFrame上的另一个组件,也可以继续显示文本高亮显示吗

但当焦点松开时,不会在文本上显示所选内容

有三种方法:

  • 使用

  • 最简单的情况是,我们将选择视为从鼠标事件绘制人工制品,请参见我的问题“如何覆盖”

  • 或以编程方式覆盖荧光灯

导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DefaultHighlighter;
导入javax.swing.text.Highlighter;
导入javax.swing.text.JTextComponent;
公共类MultiHighlight实现ActionListener{
私有JTextcomp组件;
私有字符串字符集;
公共多高亮显示(JTextC组件,字符串字符){
comp=c;
charsToHighlight=chars;
}
@凌驾
已执行的公共无效操作(操作事件e){
Highlighter h=组件获取Highlighter();
h、 移除所有突出显示();
String text=comp.getText().toUpperCase();
对于(int j=0;j=0){
试一试{
h、 addHighlight(j,j+1,DefaultHighlighter.DefaultPainter);
}捕获(BadLocationException-ble){
}
}
}
}
公共静态void main(字符串参数[]){
最终JFrame=新JFrame(“多高光”);
frame.add(新的JTextField(“另一个可聚焦的JComponents”)、BorderLayout.NORTH;
JTextArea=新的JTextArea(10,20);
area.setText(“这是兔子丢眼镜的故事。”
+“\n这是一个兔子丢了眼镜的故事。”);
frame.getContentPane().add(新的JScrollPane(区域),BorderLayout.CENTER);
JButton b=新JButton(“突出显示所有元音”);
b、 addActionListener(新的多高亮显示区域,“aeiouAEIOU”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(b,BorderLayout.SOUTH);
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
frame.pack();
frame.setVisible(true);
}
});
}
}

选择插入符号的一个简单解决方法是对DefaultCaret进行简单的子类化:

textArea.setCaret(new DefaultCaret() {
   @Override
   public void setSelectionVisible(boolean visible) {
      super.setSelectionVisible(true);
   }
});

为了更快地获得更好的帮助,请将您的代码作为演示您的问题的工具发布。这允许用户复制/粘贴和复制您的问题。我认为这是可能的,但不包括标准的小部件。为此,您必须编写
JTextArea
的子类。这非常有效。只是需要在失去焦点后保持高光。
textArea.setCaret(new DefaultCaret() {
   @Override
   public void setSelectionVisible(boolean visible) {
      super.setSelectionVisible(true);
   }
});