Java 用于透明效果的成形jdialog导致拖动问题

Java 用于透明效果的成形jdialog导致拖动问题,java,macos,swing,transparency,jdialog,Java,Macos,Swing,Transparency,Jdialog,我通过添加透明效果创建了成形JDialog 后退背景(新颜色(0,0,0,0);但它也会在内部向对话框添加拖动侦听器,问题是,当我们通过对话框中的任何其他组件(如JTextfield、JList等)拖动时,整个窗口仍然可以拖动。因此需要避免向jdialog添加内部拖动侦听器。请任何人帮助我,这是我的代码 import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.I

我通过添加透明效果创建了成形JDialog 后退背景(新颜色(0,0,0,0);但它也会在内部向对话框添加拖动侦听器,问题是,当我们通过对话框中的任何其他组件(如JTextfield、JList等)拖动时,整个窗口仍然可以拖动。因此需要避免向jdialog添加内部拖动侦听器。请任何人帮助我,这是我的代码

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class MyWindow extends JDialog {

    private static final long serialVersionUID = 1L;

    public MyWindow() {
        JTextField text = new JTextField();
        BufferedImage myPicture = null;
        try {
            myPicture = ImageIO.read(new File("background.png"));
        } catch (IOException e) {
        }
        JLabel label = new JLabel(new ImageIcon(myPicture));
        setUndecorated(true);
        setResizable(false);
        setBackground(new Color(0, 0, 0, 0));   // creating issue
        setSize(243, 474);
        text.setBounds(18, 64, 212, 368);
        add(text);
        add(label);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MyWindow win = new MyWindow();
                win.setVisible(true);
            }
        });
    }
}
提前感谢,, 当做
Bharath SR

不确定我是否完全理解您的要求,甚至您的问题,但听起来您想要的是一个没有框架、只有背景图像和组件的可拖动对话框,并且您不希望组件触发拖动事件

试试看。希望这就是你想要的。请随意提问

import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class DragDialog extends JDialog {

    private int pointX;
    private int pointY;

    public DragDialog() {
        JLabel backgroundLabel = createBackgroundLabel();
        JTextField textField = createTextField();
        setContentPane(backgroundLabel);
        add(textField);
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private JTextField createTextField() {
        final JTextField field = new JTextField(20);
        field.setText("Type \"exit\" to terminate.");
        field.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                String text = field.getText();
                if ("exit".equalsIgnoreCase(text)) {
                    System.exit(0);
                }
            }
        });
        return field;
    }

    private JLabel createBackgroundLabel() {
        Image image = null;
        try {
            image = ImageIO.read(new URL("http://satyajit.ranjeev.in/images/icons/stackoverflow.png"));
        } catch (IOException ex) {
            Logger.getLogger(DragDialog.class.getName()).log(Level.SEVERE, null, ex);
        }
        JLabel label = new JLabel(new ImageIcon(image));
        label.setLayout(new GridBagLayout());

        label.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                DragDialog.this.setLocation(DragDialog.this.getLocation().x + e.getX() - pointX,
                        DragDialog.this.getLocation().y + e.getY() - pointY);
            }
        });
        label.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                pointX = e.getX();
                pointY = e.getY();
            }
        });

        return label;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DragDialog();
            }
        });
    }
}

除了鼠标从对话框中的某个组件开始拖动外,您是否只想从任何初始点拖动对话框?我可能无法正确理解您的问题是的,绝对可以。我不想从主jdialog中任何其他组件的起始点拖动透明jdialog。如果我按components(添加到jdialog中)并拖动,它不应该拖动。我尝试了使用您的代码,但我的要求是向jdialog中添加任何图像,并通过setBackground(新颜色(0,0,0,0)使其透明;现在添加任何组件,如jtextfield、jlist或jbutton。不要添加任何拖动侦听器..但当您通过按任何组件拖动窗口时,它可以拖动..但它不应按组件拖动(按住并拖动)…不幸的是,它的拖动..如果您删除setBackground(新颜色(0、0、0、0);那么它工作得很好,但是透明度没有增加到jdialog中。。我希望您理解我的要求,并感谢您宝贵的回复。以我的示例来说,当您尝试按组件拖动对话框时,对话框不会拖动。哦。。很抱歉,我这么说。它适用于MicroSoft windows机器,但不适用于mac机器。(问题就在我告诉你的时候),可能是mac平台的问题。。