我正在试图弄清楚如何制作不可编辑的文本(不是JTextField),当鼠标滑过它时,其背景颜色会发生变化。我尝试使用JButton实现ActionListener并隐藏元素以使按钮看起来只是文本,但它只允许我在翻转时更改图标并检测单击按钮的时间。另一个想法是使用MouseListener并声明文本周围的矩形的特定坐标,在mouseMoved上它可以启动突出显示。但是,对于不同的字符串长度和自动换行等存在问题。什么是最佳对象和侦听器组合以实现鼠标翻转时突出显示的文本字段的效果?
答案 0 :(得分:2)
嗯,也许可以使用一个玩家,当场上获得fcs时,选择所有文本?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextField extends JTextField {
public TextField(String text) {
super(text);
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent fe) {
selectAll();
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField tf = new JTextField("normal field");
f.add(tf, BorderLayout.CENTER);
TextField ftf =
new TextField("funny text field");
f.add(ftf, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
});
}
}
编辑:
嗯,实际上用上面的方法找到了一个更好的方法,你必须点击文本字段才能获得焦点,现在我用一个线程检查鼠标何时在组件坐标上然后突出显示在该字段中,我使用布尔值来控制突出显示,因为常量突出显示会引发错误。希望这是你想要的:
import java.awt.*;
import javax.swing.*;
public class TextFieldHighlight extends JTextField {
static JTextField ftf;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ftf = new JTextField("Highlight");
ftf.setEditable(false);
f.add(ftf, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
Thread thread = new Thread(new Runnable() {
boolean focused = false;
@Override
public void run() {
while (true) {
if (mouseIsOverDisplayPanel()) {
if (ftf.hasFocus() && focused == false) {
ftf.selectAll();
focused = true;
} else if (!ftf.hasFocus()) {
focused = false;
}
}
}
}
});
thread.start();
}
});
}
private static boolean mouseIsOverDisplayPanel() {
if (MouseInfo.getPointerInfo().getLocation().x >= ftf.getLocationOnScreen().x
&& MouseInfo.getPointerInfo().getLocation().x <= ftf.getLocationOnScreen().x + ftf.getWidth()
&& MouseInfo.getPointerInfo().getLocation().y >= ftf.getLocationOnScreen().y
&& MouseInfo.getPointerInfo().getLocation().y <= ftf.getLocationOnScreen().y + ftf.getHeight()) {
return true;
} else {
return false;
}
}
}