java - 形状 jdialog 用于透明效果,导致拖动问题

标签 java macos swing transparency jdialog

我通过添加透明效果创建了形状的 JDialog setBackground(new Color(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);
            }
        });
    }
}

提前致谢, 问候, 巴拉特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();
            }
        });
    }
}

关于java - 形状 jdialog 用于透明效果,导致拖动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22783818/

相关文章:

在 OSX 上运行 ./gradlew 时 JAVA_HOME 设置为无效目录

objective-c - 在 NSOutlineView 中添加/删除按钮

ios - 将 kAudioUnitSubType_MultiChannelMixer 添加到 AUGraph 时静音

java - JCheckBox 没有得到更新

java - JSlider替代品

java - iText PDF - 如何添加多行页脚?

java - 开发主要通过 Spring 和 Struts 调用存储过程的应用程序的最佳方法

java - 尝试启动应用程序时出现 Eclipse "Permission denied"错误

Java - 将 JButton 数组添加到 JFrame

java - 如何正确实现Java类之间的通信