Проблема С Jtooltip

  • Автор темы Random444
  • Дата начала
R

Random444

#1
Мне нужна была всплывающая подсказка со скроллом и возможность выделять текст для копипаста. Нашел пример со скроллом, но с выделением там беда какая-то, оно то работает, то нет. Отловить баг не получается. Гляньте, может кто что подскажет?
Код:
package example;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.BevelBorder;

import org.jdesktop.swingx.JXTextArea;

public class JScrollableToolTip extends JToolTip implements MouseWheelListener {

private JXTextArea tipArea;

/** Creates a tool tip. */
public JScrollableToolTip(final int width, final int height) {
setPreferredSize(new Dimension(width, height));
setLayout(new BorderLayout());
tipArea = new JXTextArea();
tipArea.setLineWrap(true);
tipArea.setWrapStyleWord(true);
tipArea.setEditable(true);
//tipArea.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));

LookAndFeel.installColorsAndFont(tipArea, 
"ToolTip.background",
"ToolTip.foreground",
"ToolTip.font");

//LookAndFeel.installBorder(tipArea, "InternalFrame.border");				

JScrollPane scrollpane = new JScrollPane(tipArea);
scrollpane.setBorder(UIManager.getBorder("InternalFrame.border"));
scrollpane.getViewport().setOpaque(false);
add(scrollpane);

}

@Override
public void addNotify() {
super.addNotify();
JComponent comp = getComponent();
if (comp != null) {
comp.addMouseWheelListener(this);
}
}

@Override
public void removeNotify() {
JComponent comp = getComponent();
if(comp != null) {
comp.removeMouseWheelListener(this);
} 
super.removeNotify();
}

public void mouseWheelMoved(final MouseWheelEvent e) {
JComponent comp = getComponent();
if(comp != null) {
tipArea.dispatchEvent(new MouseWheelEvent(tipArea, 
e.getID(), e.getWhen(), e.getModifiers(),
0, 0, e.getClickCount(), e.isPopupTrigger(),
e.getScrollType(), e.getScrollAmount(), e.getWheelRotation()));
}
}

@Override
public void setTipText(/*final*/ String tipText) {
String oldValue = this.tipArea.getText();
tipArea.setText(tipText);
tipArea.setCaretPosition(0);
firePropertyChange("tiptext", oldValue, tipText);
}

@Override
public String getTipText() {
return tipArea == null ? "" : tipArea.getText();
}

@Override
protected String paramString() {
String tipTextString = (tipArea.getText() != null ? tipArea.getText() : "");

return super.paramString()
+ ",tipText=" + tipTextString;
}

//for testing only:
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}

JFrame f = new JFrame("JScrollableToolTip");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 200);
f.setLocationRelativeTo(null);
ToolTipManager.sharedInstance().setDismissDelay(Integer.MAX_VALUE);

JTable table = new JTable(50, 4) {

@Override
public JToolTip createToolTip() {
JScrollableToolTip tip = new JScrollableToolTip(200, 80);						 
tip.setComponent(this);
return tip; 
}
};
table.setToolTipText("Used to display a 'Tip' for a Component. "
+ "Typically components provide api to automate the process of "
+ "using ToolTips. For example, any Swing component can use the "
+ "JComponent setToolTipText method to specify the text for a standard tooltip.");
f.add(new JScrollPane(table));
f.setVisible(true);
}
});

}
}