마우스를 굴릴 때 배경색이 변경되지 않는 편집 불가능한 텍스트 (JTextField 아님)를 만드는 방법을 알아 내려고하고 있습니다. ActionListener를 구현하고 버튼을 텍스트로 보이도록 요소를 감추고 JButton을 사용하여 시도했지만, 롤오버에서 아이콘을 변경하고 버튼을 클릭 할 때만 감지 할 수 있습니다. 또 다른 생각은 MouseListener를 사용하여 텍스트 주위의 사각형의 특정 좌표를 선언하는 것입니다. mouseMoved에서 강조 표시를 시작할 수 있습니다. 그러나 다양한 문자열 길이와 단어 줄 바꿈 등의 문제가 있습니다. 마우스 롤오버에서 강조 표시된 텍스트 필드의 효과를 얻으려면 가장 좋은 개체는 무엇이고 리스너 콤보는 무엇입니까?자바 애플릿 텍스트가 롤오버에서 강조 표시
1
A
답변
2
어쩌면 foucs 리스너를 사용하고 필드가 foucs를 얻으면 모든 텍스트를 선택합니까?
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;
}
}
}
나는 그것을 밖으로 시도하고 알려 드리겠습니다 – woodlumhoodlum
감사합니다! 나는이 2 번째 예가 내가 원하는 것으로 바뀔 수 있다고 생각한다. 나는 그것을 더 매끄럽게 만들고 그것을 OO로 만들 필요가있다. 하지만 여전히 텍스트 필드의 직각 좌표를 전달해야합니다. – woodlumhoodlum
흠 ... 그렇다면 mouseIsOverDisplayPanel() 메서드에서 사각형 좌표를 받아들이지 않고 mouseIsOverDisplayPanel() 메서드를 사용하여 계산할 수있는 몇 가지 매개 변수를 mouseIsOverDisplayPanel()에 추가 할 수 있을까요? –