1

JWebBrowser を使用できるように、DJ Native Swing API を使用しています。

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 を返します (コンポーネント上にあっても)。

4

2 に答える 2

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 のいずれかであることに同意できないよりも、話は終わりました。

編集修正、SWT の GlassPane の代替 (正しい代替) が見つかりません。JWebBrowser は AWT / Swing GlassPane を超えています

出力は

ここに画像の説明を入力

于 2012-05-27T18:50:59.497 に答える
1

JWebBrowser は重量級のコンポーネントです。DJ Native Swing は、あらゆる種類のクリッピング ルールを適用することで Swing への統合を簡素化しますが、アルファ ブレンディングは実行できません。

達成できる最も近い方法は、デモ アプリケーションが "Additional Features > Pseudo Transparency" で示していることを実行することです。残念ながら、Windows 7 では更新のたびにフラッシュ効果があるようですが、頻繁に更新しない場合は問題にならない可能性があります。

于 2012-05-28T11:15:44.330 に答える