swing에서 일본어 입력시 UI가 무너지는 문제와 해결 방법
소개
여기 최근에 swing 관련 버그? 에 시달렸습니다.
예를 들어, 이와 같이 JTextField나 JTextArea 등의 JTextComponent계 컴퍼넌트를 준비했다고 합니다.
반각 영숫자를 입력하는 분에는 특별히 변함이 없지만, 일본어 입력을 한 순간에,
$\Huge{아~~~~~~~~~~~~~~
버그에도 정도가 있습니다.
구그 해 보면 InputMethodListener
의 repaint()
를 계속 두드리기 위한 버그 수정용 클래스를 준비.
버그 수정용 클래스
final class SwingPaintBugFix extends Thread {
private Window w;
private boolean running = true;
private static SwingPaintBugFix bugfix = new SwingPaintBugFix();
private SwingPaintBugFix() {}
private SwingPaintBugFix(Window w) {
this.w = w;
}
public static void of(JTextComponent txtComp, Window w) {
w.addWindowListener(new WindowAdapter() {
@Override public void windowIconified(WindowEvent e) {
bugfix.stopRunning();
}
@Override public void windowDeiconified(WindowEvent e) {
bugfix = new SwingPaintBugFix(w);
bugfix.start();
}
});
txtComp.addInputMethodListener(new InputMethodListener() {
@Override public void inputMethodTextChanged(InputMethodEvent e) {
// 全角文字を受け取る
bugfix.stopRunning();
bugfix = new SwingPaintBugFix(w);
bugfix.start();
}
@Override public void caretPositionChanged(InputMethodEvent e) {}
});
txtComp.addKeyListener(new KeyAdapter() {
// 半角文字を受け取る
@Override public void keyTyped(KeyEvent e) {}
});
}
@Override public void start() {
new Thread(this).start();
}
@Override public void run() {
while (running) {
((Component) w).repaint();
}
}
private void stopRunning() {
running = false;
}
}
그러나, 항상 while로 처리를 계속 실행한다는 행위에 저항감을 부정하지 않고, 모든 JTextComponent계 컴퍼넌트에 버그 수정용 클래스를 적용하는 것도 번거롭기 때문에, 근본적인 해결책을 찾는 것으로 했습니다.
원인 규명
우선 몇 번 재기동해도 낫지 않고.
Windows Update로 문제가 없는지 확인하면서 최신판으로 업데이트해도 안 된다.
「아멘도」라고 생각하면서도, 어쩔 수 없기 때문에 세이프 모드에. 세이프 모드에서는 조금 전의 버그가 발생하지 않는 것을 확인했으므로, 「백그라운드 프로세스」와 「서비스」를 앞두고 통상 기동으로 되돌린다.
「이것도 아닌, 이것도 아니다・・・」라고, 태스크 매니저로부터 세이프 모드 이외의 태스크를 하나씩 종료시켜, 드디어 원인을 특정!
"Nahimic Service"라는 사운드 유틸리티가 범인이었던 것 같습니다. 이 녀석을 시험에 중지시켜 보니 훌륭하게 버그가 고쳤습니다. 구그라고 보면, 이 녀석은 UI관련 이외에도 여러가지 경합을 일으키고 있는 것 같습니다.
··· 이것이라면 버그 수정 클래스란 만드는 의미 없었잖아.
Reference
이 문제에 관하여(swing에서 일본어 입력시 UI가 무너지는 문제와 해결 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/muchosucho/items/29307129b35e43a2d863
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
final class SwingPaintBugFix extends Thread {
private Window w;
private boolean running = true;
private static SwingPaintBugFix bugfix = new SwingPaintBugFix();
private SwingPaintBugFix() {}
private SwingPaintBugFix(Window w) {
this.w = w;
}
public static void of(JTextComponent txtComp, Window w) {
w.addWindowListener(new WindowAdapter() {
@Override public void windowIconified(WindowEvent e) {
bugfix.stopRunning();
}
@Override public void windowDeiconified(WindowEvent e) {
bugfix = new SwingPaintBugFix(w);
bugfix.start();
}
});
txtComp.addInputMethodListener(new InputMethodListener() {
@Override public void inputMethodTextChanged(InputMethodEvent e) {
// 全角文字を受け取る
bugfix.stopRunning();
bugfix = new SwingPaintBugFix(w);
bugfix.start();
}
@Override public void caretPositionChanged(InputMethodEvent e) {}
});
txtComp.addKeyListener(new KeyAdapter() {
// 半角文字を受け取る
@Override public void keyTyped(KeyEvent e) {}
});
}
@Override public void start() {
new Thread(this).start();
}
@Override public void run() {
while (running) {
((Component) w).repaint();
}
}
private void stopRunning() {
running = false;
}
}
우선 몇 번 재기동해도 낫지 않고.
Windows Update로 문제가 없는지 확인하면서 최신판으로 업데이트해도 안 된다.
「아멘도」라고 생각하면서도, 어쩔 수 없기 때문에 세이프 모드에. 세이프 모드에서는 조금 전의 버그가 발생하지 않는 것을 확인했으므로, 「백그라운드 프로세스」와 「서비스」를 앞두고 통상 기동으로 되돌린다.
「이것도 아닌, 이것도 아니다・・・」라고, 태스크 매니저로부터 세이프 모드 이외의 태스크를 하나씩 종료시켜, 드디어 원인을 특정!
"Nahimic Service"라는 사운드 유틸리티가 범인이었던 것 같습니다. 이 녀석을 시험에 중지시켜 보니 훌륭하게 버그가 고쳤습니다. 구그라고 보면, 이 녀석은 UI관련 이외에도 여러가지 경합을 일으키고 있는 것 같습니다.
··· 이것이라면 버그 수정 클래스란 만드는 의미 없었잖아.
Reference
이 문제에 관하여(swing에서 일본어 입력시 UI가 무너지는 문제와 해결 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/muchosucho/items/29307129b35e43a2d863텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)