У меня есть приложение, которое использует JTextPane
в основном как многострочную метку, которая может центрировать текст и автоматически обертывать его (по центру это причина, по которой я не использую более легкий компонент, но JTextArea
имеют ту же проблему). Он используется как часть более крупного объекта, который должен использовать для него одну всплывающую подсказку. Однако настройка всплывающей подсказки для содержащего компонента не работает для JTextPane
. Другие компоненты показывают всплывающую подсказку по назначению.Показывать всплывающую подсказку родительского компонента на JTextPane
SSCCE:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
public class ToolTipTest {
ToolTipTest() {
JFrame frame = new JFrame("Tool tip test");
frame.setLocationByPlatform(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel bg = new JPanel(new BorderLayout());
frame.add(bg);
bg.add(new JLabel("Tooltip shows here"), BorderLayout.NORTH);
JTextPane text = new JTextPane();
try {
text.getStyledDocument().insertString(0, "Lorem ipsum dolor sit"
+ " amet, consectetur adipiscielit, sed eiusmod tempor"
+ " incidunt ut labore et dolore magna aliqua.", null);
} catch (BadLocationException e) {
e.printStackTrace();
}
text.setEditable(false);
text.setFocusable(false);
bg.add(text);
bg.setToolTipText("A tooltip, that should show on both the label and the text");
// Works, but is ugly and results in visible change in tooltip when
// moving cursor between components
// text.setToolTipText("A tooltip, that should show on both the label and the text");
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ToolTipTest();
}
});
}
}
На приведенном выше примере подсказка отображается на JLabel
, но не на JTextPane
. В настоящее время я устанавливаю один и тот же текст подсказки для текстовой панели в качестве обходного пути, но это приводит к видимому переключению между подсказками, когда пользователь перемещает курсор мыши поверх компонентов.
Есть ли способ показать всплывающую подсказку родительского компонента на JTextPane
?
Edit: Я попытался перекрывая getToolTipText()
методы и регистрацию компоненты с менеджером режущей кромки инструмента, как это было предложено в комментариях. Это работает в том смысле, что текстовая панель затем получает текст подсказки инструмента от родителя. Однако визуальный эффект точно такой же, как и в моем обходном пути.
Интересно, если это потребуется наследство, если переопределение 'getToolTipText()' и 'getToolTipText (событие MouseEvent)' и возврат родительского элемента будет работать. Я не тестировал это. –
@HovercraftFullOfEels Не работает, к сожалению. – kiheru
Возможно, вам потребуется зарегистрировать компонент с помощью диспетчера подсказок, чтобы он запускал методы getToolTipText. – MadProgrammer