2012-03-19 2 views
1

저는 현재 사용자가 텍스트 구성 요소 내에 텍스트에 주석을 달거나 주석을 달도록 요구하는 프로젝트 작업을하고 있습니다. 사용자는 텍스트의 어딘 부분을 두 번 클릭하면 해당 위치에 툴팁이 나타납니다 (다른 대화 상자에서 지정한 텍스트 사용). 텍스트 구성 요소는 여러 위치에서 여러 툴팁을 관리 할 수 ​​있어야합니다.JTextcomponent의 다른 캐럿 위치에 여러 툴팁을 삽입하려면 어떻게해야합니까?

예 : "빠른 갈색 여우가 게으른 개 점프"

단어 앞에

을 더블 클릭하면 "빠른"다음과 같이 툴팁을 삽입하는 것 또한 단어 후 "게으른"

는 "[ 위의 툴팁] 빠른 갈색 여우는 게으른 [툴팁 위의] 개로 점프합니다. "

나는 이것을 달성하기 위해 BalloonTip과 함께 놀았습니다.

그러나 텍스트의 다른 위치에 일반 툴팁 및 풍선 툴팁을 삽입하는 데 문제가 있습니다.

아무에게도 이것을 달성하는 방법에 대한 조언을 줄 수 있습니까?

+1

로 getToolTipText (된 MouseEvent)는 특정 텍스트 – kleopatra

답변

2

1) 내가 JWindow를 사용하기보다는 JToolTip를 사용하는 것이 좋을 것, 예를 들어 다음과 같은

2) 가능한 방법 중 하나입니다

import java.awt.*; 
import java.awt.event.*; 
import java.awt.font.*; 
import java.awt.geom.*; 
import javax.swing.*; 
import java.util.*; 
import javax.swing.event.*; 

public class SimplePaintSurface implements Runnable, ActionListener { 

    private static final int WIDTH = 1250; 
    private static final int HEIGHT = 800; 
    private Random random = new Random(); 
    private JFrame frame = new JFrame("SimplePaintSurface"); 
    private JPanel tableaux; 

    @Override 
    public void run() { 
     tableaux = new JPanel(null); 
     for (int i = 1500; --i >= 0;) { 
      addRandom(); 
     } 
     frame.add(tableaux, BorderLayout.CENTER); 
     JButton add = new JButton("Add"); 
     add.addActionListener(this); 
     frame.add(add, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     tableaux.requestFocusInWindow(); 
    } 

    @Override 
    public void actionPerformed(final ActionEvent e) { 
     addRandom(); 
     tableaux.repaint(); 
    } 

    void addRandom() { 
     Letter letter = new Letter(Character.toString((char) ('a' + random.nextInt(26)))); 
     letter.setBounds(random.nextInt(WIDTH), random.nextInt(HEIGHT), 16, 16); 
     tableaux.add(letter); 
    } 

    public static void main(final String[] args) { 
     SwingUtilities.invokeLater(new SimplePaintSurface()); 
    } 
} 

class Letter extends JLabel { 

    private Font font1; 
    private Font font2; 
    private final FontRenderContext fontRenderContext1; 
    private final FontRenderContext fontRenderContext2; 

    public Letter(final String letter) { 
     super(letter); 
     setFocusable(true); 
     setBackground(Color.RED); 
     font1 = getFont(); 
     font2 = font1.deriveFont(48f); 
     fontRenderContext1 = getFontMetrics(font1).getFontRenderContext(); 
     fontRenderContext2 = getFontMetrics(font2).getFontRenderContext(); 
     MouseInputAdapter mouseHandler = new MouseInputAdapter() { 

      @Override 
      public void mouseEntered(final MouseEvent e) { 
       Letter.this.setOpaque(true); 
       setFont(font2); 
       Rectangle bounds = getBounds(); 
       Rectangle2D stringBounds = font2.getStringBounds(getText(), fontRenderContext2); 
       bounds.width = (int) stringBounds.getWidth(); 
       bounds.height = (int) stringBounds.getHeight(); 
       setBounds(bounds); 
      } 

      @Override 
      public void mouseExited(final MouseEvent e) { 
       Letter.this.setOpaque(false); 
       setFont(font1); 
       Rectangle bounds = getBounds(); 
       Rectangle2D stringBounds = font1.getStringBounds(getText(), fontRenderContext1); 
       bounds.width = (int) stringBounds.getWidth(); 
       bounds.height = (int) stringBounds.getHeight(); 
       setBounds(bounds); 
      } 
     }; 
     addMouseListener(mouseHandler); 
    } 
} 
+0

위치를 반환하도록 구현 +1이 관련 [Q & A] (http://stackoverflow.com/q/5957241/230513)도 참조하십시오. – trashgod

+0

@mKorbel 당신이 제공 한 예제는 그 맥락에서 이해할 수있는 여러 개의 JLabel과 마우스 액션을 사용합니다. 그러나 텍스트 구성 요소와 문자/캐럿 위치 사이에 이것을 재현 할 때 나는 길을 잃는다. –

+0

@trashgod 툴팁을 사용하고 싶었지만 거기에 설명 된 내용을 이해했습니다.하지만 툴 팁이 여러 개일 경우 마우스 오버없이 나타나게하려면 어떻게해야합니까? –

관련 문제