Shaped JDialog: перетаскивание в JTextField приводит к перемещению окна

Я использую прозрачный (образный) JFrame под Java 6 с Mac OS X.

Моя система сообщает мне, что Translucency.PERPIXEL_TRANSLUCENT поддерживается. Хотя моя система сообщает мне, что Translucency.PERPIXEL_TRANSPARENT не поддерживается, я обнаружил, что он работает в Mac OS X при размещении пикселей с альфа-каналом = 0.

Теперь при выборе текста в JTextField он также перетаскивает окно, как если бы я перетаскивал базовую панель содержимого.

здесь мой пример кода, чтобы попробовать (содержит основной метод для запуска на вашем компьютере)

import com.sun.awt.AWTUtilities;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class DialogTest extends JFrame {

    public DialogTest() {
        setBackground(new Color(0, 0, 0, 0));
        JPanel p1 = new JPanel() {
            public void paintComponent(Graphics g1) {
                if (g1 instanceof Graphics2D) {
                    Paint p =
                            new GradientPaint(0.0f, 0.0f, new Color(240,240,240, 0),
                            0.0f, getHeight(), new Color(240,240,240, 255), true);

                    Graphics2D g2d = (Graphics2D) g1;
                    g2d.setPaint(p);
                    Shape s = new Ellipse2D.Double(0,0,getWidth(),getHeight());
                    g2d.fill(s);
                }
            }
        };

        add(p1);
        p1.setOpaque(false);
        p1.add(new JButton("button 1"));
        JTextField tf = new JTextField("Sample Text To Select");
        p1.add(tf);
        p1.add(new JButton("button 2"));

        setUndecorated(true);       
        setSize(400,400);
        AWTUtilities.setWindowOpaque(this, false);
    }

    public static void main(String[] s) {
        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                DialogTest tw = new DialogTest();

                // Display the window.
                tw.setVisible(true);
            }
        });


   }
}

person trainrobbery    schedule 23.08.2013    source источник
comment
Очень важный. Поскольку ваша панель p1 прозрачна, вы ДОЛЖНЫ вызывать super.paintComponent, иначе вы можете столкнуться с множеством действительно серьезных проблем с отрисовкой...   -  person MadProgrammer    schedule 23.08.2013
comment
Кроме того, поскольку я думаю, что Java 1.4 или что-то в этом роде, Graphics гарантированно будет экземпляром Graphics2D...   -  person MadProgrammer    schedule 23.08.2013
comment
Конечно, вы полностью правы. Я написал это очень быстро, чтобы продемонстрировать только проблему..:)   -  person trainrobbery    schedule 23.08.2013
comment
Я не думаю, что они относятся к вашей проблеме, просто обратная связь   -  person MadProgrammer    schedule 23.08.2013
comment
Я заметил, что Mac OS X больше не рисует тень окна, а путем вызова getRootPane().putClientProperty(apple.awt.windowShadow.revalidateNow, +((new Random()).nextInt())); каждый раз, когда окно перекрашивается, это работает. Это также может быть дополнением к вашему действительно отличному уроку о том, как создавать прозрачные окна в другом потоке.   -  person trainrobbery    schedule 23.08.2013
comment
Я бы сказал, что тень — это часть украшения границы кадра...   -  person MadProgrammer    schedule 23.08.2013
comment
1) Чтобы быстрее получить помощь, опубликуйте SSCCE. 2) Не расширяйте рамку или другие контейнеры верхнего уровня. Вместо этого создайте и используйте экземпляр одного. 3) См. этот ответ для идей.   -  person Andrew Thompson    schedule 23.08.2013
comment
извините ... надеюсь, что теперь SSCCE лучше   -  person trainrobbery    schedule 24.08.2013