2012-03-19 60 views
1

我目前正在研究一个需要用户注释(或注释)文本组件内文本的项目。用户可以双击文本中的某个位置,并在该位置显示工具提示(使用他们在另一个对话框中指定的文本)。文本组件应该能够在不同位置管理多个这些工具提示。如何在JTextcomponent的不同插入位置插入多个工具提示?

例:“敏捷的棕色狐狸跳过懒狗”

字之前双击“快”,也是这个词后,“懒”的方法如下会插入提示:

“的[上面的工具提示]快速棕色狐狸跳过懒惰[上面的工具提示]狗“

我也一直在玩BalloonTip来实现这一目标。

但是,我无法正常插入工具提示和气球工具提示在文本中的不同位置。

任何人都可以给我一些建议,如何实现这一目标?

+1

实现getTooltipText(MouseEvent)方法返回一个特定位置的文本 – kleopatra 2012-03-19 15:18:18

回答

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另请参阅此相关的[问与答](http://stackoverflow.com/q/5957241/230513)。 – trashgod 2012-03-19 15:34:51

+0

@mKorbel您给出的示例使用了多个JLabel和鼠标操作,我在该上下文中理解这些操作。但是,当在文本组件中和字母/插入位置之间重新创建该文件时,我迷路了。 – 2012-03-19 15:54:03

+0

@trashgod我想使用一个工具提示,并且理解那里描述的内容 - 但是,如何获得多个工具提示并让它们在没有鼠标悬停的情况下显示? – 2012-03-19 15:55:54

相关问题