我正在使用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之上
输出将是