Java中全透明窗口的形状刷新

发布于 2024-11-18 12:40:45 字数 10800 浏览 5 评论 0原文

这是我的第一个问题,因为到目前为止我可以通过其他问题找到任何内容。我的问题来了: 我设计了一个窗户,上面有两个部分。左侧部分是完全透明的,我想在其上绘制一个可刷新的形状。 (在下文中,形状是正方形。)右侧部分始终是不透明的,我不会在其上绘制任何形状。一切正常,但对于左侧部分,背景形状不可刷新。

        package haxbot;

    import java.awt.*;
    import java.awt.Robot.*;
    import javax.swing.*;
    import java.awt.image.*;

    // import com.sun.awt.AWTUtilities;
    public class drawScreen extends javax.swing.JFrame {

        public drawScreen() {
            initComponents();
        }
    //-------------------- automatically created ---------------------------------
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {

            jLabel1 = new javax.swing.JLabel();
            jLabel2 = new javax.swing.JLabel();
            jLabel5 = new javax.swing.JLabel();
            jLabel6 = new javax.swing.JLabel();
            jButton1 = new javax.swing.JButton();

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setAlwaysOnTop(true);
            setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
            setResizable(false);
            setUndecorated(true);
            addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
                public void mouseMoved(java.awt.event.MouseEvent evt) {
                    formMouseMoved(evt);
                }
            });

            jLabel1.setText("Position:");

            jLabel2.setForeground(new java.awt.Color(255, 0, 0));
            jLabel2.setText("[ 123, 134]");

            jLabel5.setText("Color:");

            jLabel6.setForeground(new java.awt.Color(255, 0, 0));
            jLabel6.setText("[ 255, 255, 255]");

            jButton1.setBackground(new java.awt.Color(255, 0, 0));
            jButton1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
            jButton1.setForeground(new java.awt.Color(255, 0, 0));
            jButton1.setText("X");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(853, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(26, 26, 26)
                                .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(58, 58, 58)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel2)
                        .addComponent(jLabel1))
                    .addGap(18, 18, 18)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel6)
                        .addComponent(jLabel5))
                    .addContainerGap(338, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold> 
//-------------------- automatically created (end) ---------------------------------                       

        private void formMouseMoved(java.awt.event.MouseEvent evt) {                                
            MousePos = evt.getPoint();
            int mX = (int) MousePos.getX();
            int mY = (int) MousePos.getY();
            MousePos = evt.getPoint();
            jLabel2.setText("[ " + mX + ", " + mY + " ]");
            getColor(mX + (int) wind.getLocation().getX(), mY + (int) wind.getLocation().getY());
            paint(this.getGraphics());
        }                               

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            System.exit(0);
        }                                        

        public Color getColor(int mX, int mY) {
            try {
                robot = new Robot();
            } catch (AWTException awtE) {
                awtE.printStackTrace();
            }

            Rectangle captureSize = new Rectangle(mX - 15, mY - 15, 30, 30);
            img = robot.createScreenCapture(captureSize);

            currColor = robot.getPixelColor(mX, mY);


            for (int i = 0; i < img.getWidth(); i++) {
                for (int j = 0; j < img.getHeight(); j++) {
                    int x = img.getRGB(i, j);

                }
            }

            jLabel6.setText("[ " + currColor.getRed() + ", " + currColor.getGreen() + ", "
                    + currColor.getBlue() + "]");
            return currColor;
        }

        public static void main(String args[]) {
            graphicsObtained = false;
            java.awt.EventQueue.invokeLater(new Runnable() {

                public void run() {
                    wind = new drawScreen();
                    wind.setVisible(true);
                    wind.setLocation(182, 154);
                    wind.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    try {
                        //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                        SwingUtilities.updateComponentTreeUI(wind);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    // Add Transparency
                    //  AWTUtilities.setWindowOpacity(wind, (float) 0.6);
                    currColors = new Color[10][10];

                }
            });
        }

        public void paint(Graphics g) {
            leftScreen = (Graphics2D) g.create();
            leftScreen.setClip(0, 0, 840, 410);

            if (MousePos != null) {
                //leftScreen.clearRect((int) MousePos.getX() - 150, (int) MousePos.getY() - 150, 300, 300);
                leftScreen.drawRect((int) MousePos.getX() - 15, (int) MousePos.getY() - 15, 30, 30);
            }

            rightScreen = (Graphics2D) g.create();
            rightScreen.setClip(850, 0, this.getWidth(), 410);
            super.paint(rightScreen);
            rightScreen.dispose();
            leftScreen.dispose();
            if (MousePos != null) {
                //g2d1.clearRect(0, 0, 520, 430);
            }


            /*g2d.setColor(Color.red);
            g2d.clearRect(55, 430, 90, 10);
            if (MousePos != null)
            g2d.drawString("[ " + MousePos.getX() + ", " + MousePos.getY() + " ]", 55, 440);
            else
            g2d.drawString("[ 0, 0 ]", 55, 440);*/

        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JLabel jLabel6;
        // End of variables declaration                   
        private Point MousePos;
        private Point PlayerPos;
        private Color currColor;
        private static Color[][] currColors;
        private static drawScreen wind;
        private BufferedImage img;
        private static boolean graphicsObtained;
        private Graphics initialSection;
        private Graphics2D leftScreen, rightScreen;
        Robot robot = null;
    }

---------------------- 编辑(第二个代码) ---------------------- --------------------

import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.*;

// 3) Now in your class (which extends JFrame)
public class JFrameTrial extends JFrame {

    public static void main(String[] args) {
        MousePos = new Point(0, 0);

        JFrameTrial jft = new JFrameTrial();
        jft.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jft.setSize(300, 300);
        jft.setVisible(true);

    }

    public JFrameTrial() {
        /* 4) set the contentPane using setContentPane
        as the class you just created extending JComponent.*/
        jct = new JComponentTrial(150, 150);
        setContentPane(jct);

        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                MousePos = e.getPoint();
                getContentPane().repaint();
            }
        });
    }
    private JComponentTrial jct;
    private static Point MousePos;

    // 1) But what you have to do is create a class which extends JComponent.
    private class JComponentTrial extends JComponent {

        public JComponentTrial(int x, int y) {
            setSize(x, y);
        }

        // 2)There override the paintComponent() method with whatever you want to draw.
        @Override
        public void paintComponent(Graphics g) {
            Graphics gg = g.create();
            gg.setColor(Color.red);
            gg.drawRect((int) MousePos.getX() - 15,
                    (int) MousePos.getY() - 15, 30, 30);
            gg.dispose();
        }
    }
}

this is my first question since I could find anything by the other questions so far. Here comes my question:
I designed a window on which I have two portions. The left portion is fully transparent and I want to draw a refrashable shape on it. (In the following, the shapw is a square.) The right portion is always opaque and I won't draw any shape on it. Everything is OK but for the left portion, background shape is not refrashable.

        package haxbot;

    import java.awt.*;
    import java.awt.Robot.*;
    import javax.swing.*;
    import java.awt.image.*;

    // import com.sun.awt.AWTUtilities;
    public class drawScreen extends javax.swing.JFrame {

        public drawScreen() {
            initComponents();
        }
    //-------------------- automatically created ---------------------------------
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {

            jLabel1 = new javax.swing.JLabel();
            jLabel2 = new javax.swing.JLabel();
            jLabel5 = new javax.swing.JLabel();
            jLabel6 = new javax.swing.JLabel();
            jButton1 = new javax.swing.JButton();

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setAlwaysOnTop(true);
            setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
            setResizable(false);
            setUndecorated(true);
            addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
                public void mouseMoved(java.awt.event.MouseEvent evt) {
                    formMouseMoved(evt);
                }
            });

            jLabel1.setText("Position:");

            jLabel2.setForeground(new java.awt.Color(255, 0, 0));
            jLabel2.setText("[ 123, 134]");

            jLabel5.setText("Color:");

            jLabel6.setForeground(new java.awt.Color(255, 0, 0));
            jLabel6.setText("[ 255, 255, 255]");

            jButton1.setBackground(new java.awt.Color(255, 0, 0));
            jButton1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
            jButton1.setForeground(new java.awt.Color(255, 0, 0));
            jButton1.setText("X");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(853, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(26, 26, 26)
                                .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(58, 58, 58)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel2)
                        .addComponent(jLabel1))
                    .addGap(18, 18, 18)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel6)
                        .addComponent(jLabel5))
                    .addContainerGap(338, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold> 
//-------------------- automatically created (end) ---------------------------------                       

        private void formMouseMoved(java.awt.event.MouseEvent evt) {                                
            MousePos = evt.getPoint();
            int mX = (int) MousePos.getX();
            int mY = (int) MousePos.getY();
            MousePos = evt.getPoint();
            jLabel2.setText("[ " + mX + ", " + mY + " ]");
            getColor(mX + (int) wind.getLocation().getX(), mY + (int) wind.getLocation().getY());
            paint(this.getGraphics());
        }                               

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            System.exit(0);
        }                                        

        public Color getColor(int mX, int mY) {
            try {
                robot = new Robot();
            } catch (AWTException awtE) {
                awtE.printStackTrace();
            }

            Rectangle captureSize = new Rectangle(mX - 15, mY - 15, 30, 30);
            img = robot.createScreenCapture(captureSize);

            currColor = robot.getPixelColor(mX, mY);


            for (int i = 0; i < img.getWidth(); i++) {
                for (int j = 0; j < img.getHeight(); j++) {
                    int x = img.getRGB(i, j);

                }
            }

            jLabel6.setText("[ " + currColor.getRed() + ", " + currColor.getGreen() + ", "
                    + currColor.getBlue() + "]");
            return currColor;
        }

        public static void main(String args[]) {
            graphicsObtained = false;
            java.awt.EventQueue.invokeLater(new Runnable() {

                public void run() {
                    wind = new drawScreen();
                    wind.setVisible(true);
                    wind.setLocation(182, 154);
                    wind.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    try {
                        //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                        SwingUtilities.updateComponentTreeUI(wind);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    // Add Transparency
                    //  AWTUtilities.setWindowOpacity(wind, (float) 0.6);
                    currColors = new Color[10][10];

                }
            });
        }

        public void paint(Graphics g) {
            leftScreen = (Graphics2D) g.create();
            leftScreen.setClip(0, 0, 840, 410);

            if (MousePos != null) {
                //leftScreen.clearRect((int) MousePos.getX() - 150, (int) MousePos.getY() - 150, 300, 300);
                leftScreen.drawRect((int) MousePos.getX() - 15, (int) MousePos.getY() - 15, 30, 30);
            }

            rightScreen = (Graphics2D) g.create();
            rightScreen.setClip(850, 0, this.getWidth(), 410);
            super.paint(rightScreen);
            rightScreen.dispose();
            leftScreen.dispose();
            if (MousePos != null) {
                //g2d1.clearRect(0, 0, 520, 430);
            }


            /*g2d.setColor(Color.red);
            g2d.clearRect(55, 430, 90, 10);
            if (MousePos != null)
            g2d.drawString("[ " + MousePos.getX() + ", " + MousePos.getY() + " ]", 55, 440);
            else
            g2d.drawString("[ 0, 0 ]", 55, 440);*/

        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JLabel jLabel6;
        // End of variables declaration                   
        private Point MousePos;
        private Point PlayerPos;
        private Color currColor;
        private static Color[][] currColors;
        private static drawScreen wind;
        private BufferedImage img;
        private static boolean graphicsObtained;
        private Graphics initialSection;
        private Graphics2D leftScreen, rightScreen;
        Robot robot = null;
    }

---------------------- EDIT (Second Code) -------------------------------------------

import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.*;

// 3) Now in your class (which extends JFrame)
public class JFrameTrial extends JFrame {

    public static void main(String[] args) {
        MousePos = new Point(0, 0);

        JFrameTrial jft = new JFrameTrial();
        jft.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jft.setSize(300, 300);
        jft.setVisible(true);

    }

    public JFrameTrial() {
        /* 4) set the contentPane using setContentPane
        as the class you just created extending JComponent.*/
        jct = new JComponentTrial(150, 150);
        setContentPane(jct);

        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                MousePos = e.getPoint();
                getContentPane().repaint();
            }
        });
    }
    private JComponentTrial jct;
    private static Point MousePos;

    // 1) But what you have to do is create a class which extends JComponent.
    private class JComponentTrial extends JComponent {

        public JComponentTrial(int x, int y) {
            setSize(x, y);
        }

        // 2)There override the paintComponent() method with whatever you want to draw.
        @Override
        public void paintComponent(Graphics g) {
            Graphics gg = g.create();
            gg.setColor(Color.red);
            gg.drawRect((int) MousePos.getX() - 15,
                    (int) MousePos.getY() - 15, 30, 30);
            gg.dispose();
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

国际总奸 2024-11-25 12:40:45

一些建议:

  • 在扩展 JPanel 或 JComponent 的类中绘制,而不是 JFrame。
  • 使用重写的paintComponent方法而不是paint方法进行绘制。
  • PaintComponent 方法的第一行应该是对 super.paintComponent(g); 的调用
  • ,不要处置在paintComponent(或paint)参数中传递给您的Graphics 对象。仅处理您自己创建的 Graphics 或 Graphics2D 对象。

A few suggestions:

  • Draw in an class that extends JPanel or JComponent, not JFrame.
  • Draw in an overridden paintComponent method, not a paint method.
  • The first line of your paintComponent method should be a call to super.paintComponent(g);
  • Don't dispose of the Graphics object passed to you in the paintComponent (or paint) parameter. Only dispose Graphics or Graphics2D objects that you yourself have created.
辞别 2024-11-25 12:40:45

对于 Swing,您需要重写 paintComponent() 而不是 paint()。您直接在顶层容器上绘图。考虑使用 JPanel。覆盖 JPanel 的 paintComponent

编辑

阅读您的反馈后,我想您需要做的是以下事情:

首先,要记住一些要点:

  1. JFrame 不是 JComponent 的子类。所以它没有paintComponent()。并且paint不应该与Swing一起使用。因此您需要做一些不同的事情。

  2. 与所有顶级容器一样,JFrame 也定义了许多窗格,其顶部是 JRootPane。JRootPane 由 glass 组成窗格内容窗格分层窗格。通常我们所做的只是创建一个类,它扩展一个组件,例如 JPanel。在该类中,我们重写 paintComponent() 方法,这就是我们绘制事物的方式。然后我们只需将其添加到 JFrame 的内容窗格中。

但您需要做的是创建一个扩展JComponent 的类。用你想要绘制的任何东西覆盖paintComponent()方法。现在,在您的类(扩展 JFrame)中,使用 setContentPane 设置 contentPane 作为您刚刚创建的扩展 JComponent 的类。 setContentPane 的结构是

public void setContentPane(Container contentPane)

因此,您可以传递扩展 JComponent 的类的对象,因为 JComponent 是 Container 的子类。

您所做的只是在使用 getContentPane 后设置内容窗格的布局。但您还需要对其进行设置,以使其按照您希望的方式运行。通常我们不会这样做,因为我们直接使用add()将组件添加到内容窗格中。我希望这会起作用。

For Swing, you need to override paintComponent() and not paint(). You are drawing directly on a top level container. Consider using a JPanel. override the paintComponent of the JPanel.

EDIT

After reading your feedback, I guess what you need to do is the following:

First, some points to remember:

  1. JFrame is not a subclass of JComponent. So it does not have paintComponent().And paint shouldn't be used with Swing. So you need to do something different.

  2. Like all top level containers, JFrame also defines a number of panes, at the top of which is the JRootPane.JRootPane is made up of the glass pane,the content pane and the layered pane. Usually what we do is just create a class, which extends a component such as JPanel. In that class we override the paintComponent() method and that's how we paint things.then we just add it t the content pane of the JFrame.

But what you have to do is create a class which extends JComponent. There override the paintComponent() method with whatever you want to draw. Now in your class (which extends JFrame) set the contentPane using setContentPane as the class you just created extending JComponent. The structure of setContentPane is

public void setContentPane(Container contentPane)

So you can pass the object of a class which extends JComponent since JComponent is a subclass of Container.

What you have done is just set the layout of the content pane after using getContentPane. But you also need to set it in order for it to behave the way you want it to. Usually we don't do such a thing, because we add components to the content pane directly using add(). I hope this will work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文