首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示在玻璃窗格上方的JWebBrowser (扩展JPanel)

显示在玻璃窗格上方的JWebBrowser (扩展JPanel)
EN

Stack Overflow用户
提问于 2012-05-28 02:43:40
回答 2查看 2.3K关注 0票数 1

为了能够使用JWebBrowser,我正在使用DJ Native Swing API。

代码语言:javascript
复制
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 (即使它在组件上)。

EN

回答 2

Stack Overflow用户

发布于 2012-05-28 02:50:59

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

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

我对这个窗格的目标是当用户使用图形用户界面时能够得到鼠标的位置。由于某些原因,鼠标位置使用webBrowser.getMousePosition()或webBrowserPanel.getMousePosition()返回null (即使它在组件上)。

默认情况下使用GlassPane来使用MouseEvents,但您可以重新调度这些事件

编辑

如果我使用codersource中代码示例

代码语言:javascript
复制
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编写的代码

代码语言:javascript
复制
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之上

输出将是

票数 2
EN

Stack Overflow用户

发布于 2012-05-28 19:15:44

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

您所能实现的最接近的方法是执行演示应用程序在“附加功能>伪透明度”中所显示的操作。不幸的是,在Windows7上,似乎每次刷新都会有闪烁效果,但对于你来说,如果不经常刷新,这可能不是问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10776359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档