2012-03-19 4 views
1

В настоящее время я работаю над проектом, который требует от пользователя аннотировать (или комментировать) текст внутри текстового компонента. Пользователь дважды щелкнет где-нибудь в тексте, и в этой позиции появится подсказка (с текстом, который они указывают в другом диалоговом окне). Текстовый компонент должен иметь возможность управлять несколькими этими подсказками в разных положениях.Как вставить несколько подсказок в разные позиции каретки в JTextкомпонент?

Пример: «быстрая коричневая лиса прыгает через ленивую собаку»

Двойной щелчок перед словом «быстрый», а также после того, как слово «ленивый» вставит всплывающие подсказки следующим образом:

«код [ подсказка выше здесь] быстрый коричневый лис прыгает через ленивый [подсказка выше здесь] собака "

Я также играл с 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 Пример, который вы дали, использует несколько JLabels и действия мыши, которые я понимаю в этом контексте. Однако, когда дело доходит до воссоздания этого в текстовом компоненте и между буквами/на каретках, я теряюсь. –

+0

@trashgod Я хотел использовать всплывающую подсказку, и я понимаю, что там описано, но как я могу найти несколько подсказок и показать их без наведения? –

 Смежные вопросы

  • Нет связанных вопросов^_^