我正在使用DJ Native Swing API来使用JWebBrowser。

public class GUI extends JPanel {

    Robot robot;
    JComponent glassPane;

    public GUI(final Bot bot) {
        super(new BorderLayout());
        try {
            robot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
        JPanel webBrowserPanel = new JPanel(new BorderLayout());
        JWebBrowser webBrowser = new JWebBrowser(JWebBrowser.constrainVisibility());
        webBrowser.setBarsVisible(false);
        webBrowser.setButtonBarVisible(false);
        webBrowser.setMenuBarVisible(false);
        webBrowser.navigate("http://google.com");
        webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
        add(webBrowserPanel, BorderLayout.CENTER);

        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
        final JButton button = new JButton("Start");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (bot.isRunning()) {
                    button.setText("Start");
                } else {
                    button.setText("Stop");
                }
                bot.setRunning(!bot.isRunning());
            }
        });
        buttonPanel.add(button, BorderLayout.WEST);
        add(buttonPanel, BorderLayout.NORTH);

        JFrame mainFrame = new JFrame("Bot");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().add(this, BorderLayout.CENTER);

        glassPane = new JComponent()
        {
            public void paintComponent(Graphics g)
            {
                g.setColor(new Color(1, 0, 0, 0.5f));
                g.fillRect(10, 10, 815, 775);
            }
        };
        glassPane.setSize(815,775);
        glassPane.setOpaque(false);
       mainFrame.setGlassPane(glassPane);
        glassPane.setVisible(true);


        mainFrame.setSize(815, 775);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
    }
}


运行此命令时,我希望在整个GUI上看到一个红色矩形。这不会发生。这是我所看到的(对不起,它不允许我发布直接图像):
http://i.stack.imgur.com/ZAe51.png

为什么JWebBrowser出现在玻璃窗格上方?我认为玻璃窗格应该覆盖所有内容。

JWebBrowser扩展了JPanel。这里是文档:Javadoc

我对这个玻璃窗格的目标是当用户使用GUI时能够获得鼠标位置。由于某种原因,鼠标位置使用webBrowser.getMousePosition()或webBrowserPanel.getMousePosition()返回空值(即使它在组件上方)。

最佳答案

为什么JWebBrowser出现在玻璃窗格上方?我认为玻璃窗格应该覆盖所有内容。


因为您设置了mainFrame.setGlassPane(glassPane);


  我对这个玻璃窗格的目标是当用户使用GUI时能够获得鼠标位置。由于某种原因,鼠标位置使用webBrowser.getMousePosition()或webBrowserPanel.getMousePosition()返回空值(即使它在组件上方)。


GlassPane默认使用MouseEvents,但是您可以重新分发这些事件

编辑

如果我使用来自codersource的代码示例

import java.awt.Image;
import java.awt.Toolkit;
import java.util.Arrays;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import chrriis.common.UIUtils;
import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import javax.swing.JRootPane;

/**
 * @author Christopher Deckers
 */
public class DemoFrame {

    public static void main(String[] args) {
        UIUtils.setPreferredLookAndFeel();
        NativeInterface.open();
        Toolkit.getDefaultToolkit().setDynamicLayout(true);
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame demoFrame = new JFrame("The DJ Project - NativeSwing (SWT)");
                Class<DemoFrame> clazz = DemoFrame.class;
                if (System.getProperty("java.version").compareTo("1.6") >= 0) {
                    demoFrame.setIconImages(Arrays.asList(new Image[]{
                                new ImageIcon(clazz.getResource("resource/DJIcon16x16.png")).getImage(),
                                new ImageIcon(clazz.getResource("resource/DJIcon24x24.png")).getImage(),
                                new ImageIcon(clazz.getResource("resource/DJIcon32x32.png")).getImage(),
                                new ImageIcon(clazz.getResource("resource/DJIcon48x48.png")).getImage(),
                                new ImageIcon(clazz.getResource("resource/DJIcon256x256.png")).getImage(),}));
                } else {
                    demoFrame.setIconImage(new ImageIcon(clazz.getResource("resource/DJIcon32x32Plain.png")).getImage());
                }
                demoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                demoFrame.getContentPane().add(new DemoPane());
                demoFrame.setSize(800, 600);
                demoFrame.setLocationByPlatform(true);


                MyGlassPane glassPane = new MyGlassPane();
                JRootPane rootPane = SwingUtilities.getRootPane(demoFrame);
                rootPane.setGlassPane(glassPane);
                glassPane.activate("");


                demoFrame.setVisible(true);
            }
        });
        NativeInterface.runEventPump();
    }
}


用@camickr的代码

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

/*
 *  Simple implementation of a Glass Pane that will capture and ignore all
 *  events as well paint the glass pane to give the frame a "disabled" look.
 *
 *  The background color of the glass pane should use a color with an
 *  alpha value to create the disabled look.
 */
public class MyGlassPane extends JComponent
        implements KeyListener {

    private final static Border MESSAGE_BORDER = new EmptyBorder(10, 10, 10, 10);
    private JLabel message = new JLabel();

    public MyGlassPane() {
        //  Set glass pane properties

        setOpaque(false);
        Color base = UIManager.getColor("inactiveCaptionBorder");
        Color background = new Color(base.getRed(), base.getGreen(), base.getBlue(), 128);
        setBackground(background);
        setLayout(new GridBagLayout());

        //  Add a message label to the glass pane

        add(message, new GridBagConstraints());
        message.setOpaque(true);
        message.setBorder(MESSAGE_BORDER);

        //  Disable Mouse, Key and Focus events for the glass pane

        addMouseListener(new MouseAdapter() {
        });
        addMouseMotionListener(new MouseMotionAdapter() {
        });

        addKeyListener(this);

        setFocusTraversalKeysEnabled(false);
    }

    /*
     *  The component is transparent but we want to paint the background
     *  to give it the disabled look.
     */
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRect(0, 0, getSize().width, getSize().height);
    }

    /*
     *  The background color of the message label will be the same as the
     *  background of the glass pane without the alpha value
     */
    @Override
    public void setBackground(Color background) {
        super.setBackground(background);

        Color messageBackground = new Color(background.getRGB());
        message.setBackground(messageBackground);
    }
//
//  Implement the KeyListener to consume events
//

    public void keyPressed(KeyEvent e) {
        e.consume();
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
        e.consume();
    }

    /*
     *  Make the glass pane visible and change the cursor to the wait cursor
     *
     *  A message can be displayed and it will be centered on the frame.
     */
    public void activate(String text) {
        if (text != null && text.length() > 0) {
            message.setVisible(true);
            message.setText(text);
            message.setForeground(getForeground());
        } else {
            message.setVisible(false);
        }

        setVisible(true);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        requestFocusInWindow();
    }

    /*
     *  Hide the glass pane and restore the cursor
     */
    public void deactivate() {
        setCursor(null);
        setVisible(false);
    }
}


然后输出将是



我不能同意GlassPane不在JComponent或JWebBrowser之下,故事结束了,

编辑更正,我找不到适用于SWT的GlassPane的替代品(正确的替代品),那么您是对的JWebBrowser位于AWT / Swing GlassPane之上

输出将是

10-08 14:24