我正在使用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出现在玻璃窗格上?我认为Glass Pane应该超过一切。
JWebBrowser扩展了JPanel。以下是文档:Javadoc
我对这个玻璃窗格的目标是在用户使用GUI时能够获得鼠标位置。由于某种原因,使用webBrowser.getMousePosition()或webBrowserPanel.getMousePosition(),鼠标位置返回null(即使它位于组件上方)。
答案 0 :(得分:2)
为什么JWebBrowser出现在玻璃窗格上?我认为Glass Pane应该超过一切。
因为您设置了mainFrame.setGlassPane(glassPane);
我对这个玻璃窗格的目标是在用户使用GUI时能够获得鼠标位置。由于某种原因,使用webBrowser.getMousePosition()或webBrowserPanel.getMousePosition(),鼠标位置返回null(即使它位于组件上方)。
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,故事结束了,
EDIT更正,我找不到GlassPane for SWT的替代方案(正确的选择),那么你是对的JWebBrowser在AWT / Swing GlassPane上
输出
答案 1 :(得分:1)
JWebBrowser是一个重量级组件。 DJ Native Swing通过应用各种裁剪规则简化了Swing中的集成,但它不能进行alpha混合。
您可以实现的最接近的是演示应用程序在“其他功能&gt;伪透明度”中显示的内容。不幸的是,在Windows 7上似乎每次刷新都会产生闪烁效果,但如果你不经常刷新,这可能不是你的问题。