1

我正在使用 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() 返回 null(即使它位于组件上方)。

4

2 回答 2

2

为什么 JWebBrowser 出现在玻璃窗格上?我认为玻璃窗格应该涵盖一切。

因为你设置mainFrame.setGlassPane(glassPane);

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

GlassPane默认为 consume 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

输出将是

在此处输入图像描述

于 2012-05-27T18:50:59.497 回答
1

JWebBrowser 是一个重量级的组件。DJ Native Swing 通过应用各种剪切规则简化了 Swing 中的集成,但它不能进行 alpha 混合。

您可以实现的最接近的方法是执行演示应用程序在“附加功能 > 伪透明度”中显示的内容。不幸的是,在 Windows 7 上似乎每次刷新都有闪烁效果,但如果您不经常刷新,这可能不是您的问题。

于 2012-05-28T11:15:44.330 回答