Подсказка Force HeavyWeight с фигурной панелью 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
Ниахахаха, это меня убивает ... как я могу иметь большую разницу между разными JDK разных ОС ... разве java не должна быть кросс-платформенной? :(.   -  person user1841257    schedule 17.06.2013
comment
Да положено. Тем не менее, вы всегда можете ожидать некоторые различия. Это, наверное, регресс. Некоторые люди будут разглагольствовать, что Java — это Write Once Debug Everywhere.   -  person Guillaume Polet    schedule 17.06.2013
comment
лол, спасибо, Гийом, за помощь. Если кто-нибудь знает, как я могу решить эту проблему, мне нужно, чтобы она работала с большинством JRE... это главная проблема в моем списке задач, даже перестроение всего TooltipManager должно быть вариантом... если это кажется вам умным . Спасибо еще раз.   -  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
Майкл: Пытался назвать это в восточноевропейском времени, но без изменений... спасибо за предложение.   -  person user1841257    schedule 18.06.2013


Ответы (1)


Проблема, возможно, связана с:

person aterai    schedule 18.06.2013
comment
Также были некоторые проблемы с всплывающими меню, но исправленные они довольно легко по сравнению с всплывающими подсказками. Сегодня я попробую полностью переделать свой менеджер всплывающих подсказок и посмотреть, что у меня получится. - person user1841257; 18.06.2013