使用Swing绘制选择框

时间:2011-04-20 08:33:19

标签: java swing awt

我用面板和三个按钮编写了一个应用程序。我想使用鼠标添加选择此按钮。我的意思是我们在桌面上的Windows中。我按下鼠标左键,随着鼠标的移动,区域选择也在增长。

这个中是否有特定的接口,或者我是否手动调用事件监听器的相应方法并绘制透明矩形?这是一张图片:

Example Screenshot

所以当我使用鼠标拖动绘制矩形时,我有一个问题,按钮正在重新绘制,因此用户可以看到闪烁按钮。当我画矩形时,我想要这个按钮不要消失。我想我需要使用glassPane。这是我的观念。我有一个框架。在框架中我添加了带按钮的面板,我需要另一个面板,我将绘制透明矩形。我在想,然后我的按钮仍然不会重新粉刷。你对这个概念有什么看法?或者也许有人有另一个想法。这是代码:

        @Override
        public void mousePressed(MouseEvent e) {
            startPoint=e.getPoint();
            setOpaque(true);

            Graphics2D g2 = (Graphics2D)getGraphics();

            Rectangle2D prostokat = new Rectangle2D.Double();
            prostokat.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
            g2.setComposite(AlphaComposite.getInstance(rule, alpha));
            g2.draw(prostokat);
            g2.setColor(Color.BLUE);
            g2.fill(prostokat);


        }



        @Override
        public void mouseDragged(MouseEvent e) {
            setOpaque(true);

            Graphics2D g2 = (Graphics2D)getGraphics();
            Rectangle2D prostokat = new Rectangle2D.Double();

            prostokat.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
            g2.setComposite(AlphaComposite.getInstance(rule, alpha));
            g2.draw(prostokat);
            g2.setColor(Color.BLUE);
            g2.fill(prostokat);
            paintComponent(g2);


        }

        int rule = AlphaComposite.SRC_OVER;
        float alpha = 0.85F;




    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable()
        {
public void run()
            {
                zaznacz rys = new zaznacz();
                JFrame frame = new JFrame();
                JButton Button = new JButton("1");
                JPanel panel = new JPanel();



                panel.add(Button);
                rys.add(panel);
                frame.setSize(400,300);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                panel.setOpaque(false);

                frame.add(rys);


            }
        });
    }

}

我知道代码不完美但几乎可以工作。我有一点问题。当我按下鼠标按钮并拖动我的按钮消失时。 enter image description here enter image description here

我不需要像“你的代码错了”这样的建议。我知道,我想有人帮助我,我必须纠正。我知道我不应该在mouseEvents中使用paintComponent(),但只有这样才能绘制透明矩形。或者也许你可以不知道如何绘制透明矩形。我尝试尝试,我认为我必须改变mouseDragged方法。因为当我从这个方法中删除代码并且只在按钮上绘制矩形时,一切正常。但问题是我需要通过拖动鼠标来绘制矩形。我应该改变油漆,但我不知道如何。有人可以帮助我或尝试帮助我吗?

1 个答案:

答案 0 :(得分:2)

我认为该代码在这种形式(主要)中不起作用,也许有人会为你调试,请跟随Joey的建议

非常令人反感的话,无论如何(Oracle Java教程)http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html