2012-06-14 1 views
1

마우스를 굴릴 때 배경색이 변경되지 않는 편집 불가능한 텍스트 (JTextField 아님)를 만드는 방법을 알아 내려고하고 있습니다. ActionListener를 구현하고 버튼을 텍스트로 보이도록 요소를 감추고 JButton을 사용하여 시도했지만, 롤오버에서 아이콘을 변경하고 버튼을 클릭 할 때만 감지 할 수 있습니다. 또 다른 생각은 MouseListener를 사용하여 텍스트 주위의 사각형의 특정 좌표를 선언하는 것입니다. mouseMoved에서 강조 표시를 시작할 수 있습니다. 그러나 다양한 문자열 길이와 단어 줄 바꿈 등의 문제가 있습니다. 마우스 롤오버에서 강조 표시된 텍스트 필드의 효과를 얻으려면 가장 좋은 개체는 무엇이고 리스너 콤보는 무엇입니까?자바 애플릿 텍스트가 롤오버에서 강조 표시

답변

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; 

     } 
    } 
} 
+0

나는 그것을 밖으로 시도하고 알려 드리겠습니다 – woodlumhoodlum

+0

감사합니다! 나는이 2 번째 예가 내가 원하는 것으로 바뀔 수 있다고 생각한다. 나는 그것을 더 매끄럽게 만들고 그것을 OO로 만들 필요가있다. 하지만 여전히 텍스트 필드의 직각 좌표를 전달해야합니다. – woodlumhoodlum

+0

흠 ... 그렇다면 mouseIsOverDisplayPanel() 메서드에서 사각형 좌표를 받아들이지 않고 mouseIsOverDisplayPanel() 메서드를 사용하여 계산할 수있는 몇 가지 매개 변수를 mouseIsOverDisplayPanel()에 추가 할 수 있을까요? –