Force HeavyWeight Tooltip с оформен JPanel

Работя върху приложение с персонализирана форма и имам проблем с подсказките на моите бутони. Изолирах проблема в прост пример, който илюстрира точно моята ситуация.

Можете да видите, подсказката на средния бутон се показва добре, защото е по-голяма от основния панел, но тази на левия бутон не работи и е скрита от персонализираната ми форма.

Ето моят пример:

import java.awt.Point;
import java.awt.Polygon;
import java.awt.Shape;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.ToolTipManager;

public class ButtonDemo extends JPanel {
protected JButton b1, b2, b3;

public ButtonDemo() {
    b1 = new JButton("Disable middle button");
    b1.setVerticalTextPosition(AbstractButton.CENTER);
    b1.setHorizontalTextPosition(AbstractButton.LEADING);

    b2 = new JButton("Middle button");
    b2.setVerticalTextPosition(AbstractButton.BOTTOM);
    b2.setHorizontalTextPosition(AbstractButton.CENTER);

    b3 = new JButton("Enable middle button");
    b3.setEnabled(false);

    b1.setToolTipText("Click this button to disable the middle button.");
    b2.setToolTipText("This middle button does nothing when you click it. This middle button does nothing when you click it. This middle button does nothing when you click it.");
    b3.setToolTipText("Click this button to enable the middle button.");

    add(b1);
    add(b2);
    add(b3);
}

private static void createAndShowGUI() {

    JFrame frame = new JFrame("ButtonDemo");

    frame.setUndecorated(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Create and set up the content pane.
    ButtonDemo newContentPane = new ButtonDemo();
    newContentPane.setOpaque(true); // content panes must be opaque
    frame.setContentPane(newContentPane);

    // Display the window.
    frame.pack();
    frame.setSize(1024, 768);
    frame.setVisible(true);
    frame.setLocation(0, 0);

    // Shape
    final Point[] points = new Point[]{
            //
            new Point(0, 0),
            //
            new Point(0, frame.getHeight()),
            //
            new Point(frame.getWidth() - 400, frame.getHeight()),
            //
            new Point(frame.getWidth() - 400, 25),
            //
            new Point(frame.getWidth(), 25),
            //
            new Point(frame.getWidth(), 0),
            //
            new Point(0, 0)};

    int[] xpoints = new int[points.length];
    int[] ypoints = new int[points.length];

    for (int i = 0; i < points.length; i++) {
        xpoints[i] = (int) points[i].getX();
        ypoints[i] = (int) points[i].getY();
    }

    Shape formeFenetre = new Polygon(xpoints, ypoints, points.length);

    frame.setShape(formeFenetre);

}
public static void main(final String[] args) {

    ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);

    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            createAndShowGUI();
        }
    });
}
}

Помислих си "ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);" беше точно това, което търсех, но не работи много добре с моя JRE. Между другото, използвам Java 1.7.0_09, но трябва да работи с всеки JRE в 1.7.

Дано някой знае какво да прави! Благодаря за четенето.


person user1841257    schedule 17.06.2013    source източник
comment
Не съм сигурен какъв е проблемът. Не виждам да имате проблем с използването на JDK 1.7.0_02 на Windows 7.   -  person Guillaume Polet    schedule 17.06.2013
comment
В момента съм на JDK 1.7.0_09 с windows VISTA ... пробвах с JDK 1.7.0_21, 1.7.0_13 ... но всъщност работи с JDK 1.7.0_0   -  person user1841257    schedule 17.06.2013
comment
Niahahaha, това ме убива ... как мога да имам голяма разлика между различни JDK на различни OS ... не трябва ли java да е междуплатформена? :(.   -  person user1841257    schedule 17.06.2013
comment
Да, предполага се. Все пак винаги можете да очаквате някои разлики. Това вероятно е регресия. Някои хора ще изтъргуват, че Java е Write Once Debug Everywhere.   -  person Guillaume Polet    schedule 17.06.2013
comment
хаха, благодаря Гийом за помощта ти. Ако някой знае как мога да разреша този проблем, трябва да го накарам да работи с повечето JRE... това е основен проблем в моя ToDo List, дори възстановяването на цял TooltipManager трябва да е опция... ако ви изглежда умно . Thx отново.   -  person user1841257    schedule 17.06.2013
comment
Работи добре и на моя JRE, с версия C:\Mine\JAVA\J2SE\classes>java -version java version "1.7.0_03"/Java(TM) SE Runtime Environment (build 1.7.0_03-b05)/Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing)   -  person nIcE cOw    schedule 17.06.2013
comment
Не работи за мен (java версия 1.7.0_10) на Windows 7. Така че изглежда като проблем с версията. Нямам идея как да го оправя.   -  person camickr    schedule 17.06.2013
comment
Само малка точка, но препоръчвам да избягвате напълно оформените прозорци на две основания. 1) Програмистът обикновено си мисли, че са сладки или „кеули“, но потребителите обикновено не го правят. 2) Повечето опитни разработчици всъщност не се интересуват достатъчно, за да издадат доклад за грешка, когато се провалят, и поради същата причина не биха отделили много време, опитвайки се да намерят заобиколни решения.   -  person Andrew Thompson    schedule 17.06.2013
comment
Може да се наложи да извикате setLightWeightPopupEnabled(false) на EDT.   -  person Michael Krussel    schedule 17.06.2013
comment
Андрю: Напълно съгласен, оформеният прозорец е гаден за потребителския интерфейс, силно препоръчвам на всеки да не го използва, но в нашия случай имаме нужда от него, не можахме да намерим друга опция за интелигентно интегриране на друго приложение в моето.   -  person user1841257    schedule 18.06.2013
comment
Майкъл : Опитах се да го извикам в EDT, но няма промяна... благодаря за предложението.   -  person user1841257    schedule 18.06.2013


Отговори (1)


Проблемът вероятно е свързан с:

person aterai    schedule 18.06.2013
comment
Също така имаше проблем с изскачащи менюта, но ги поправи доста лесно в сравнение с това с подсказки. Днес ще се опитам да преразвия напълно моя tooltipmanager и да видя какво мога да направя. - person user1841257; 18.06.2013