创建玻璃窗

时间:2011-05-13 09:49:19

标签: swing glasspane

我有一个问题。我可以在体内创建GlassPne MousePressed吗?如果有,任何人都可以写我怎么样?我的意思是我按下鼠标按钮,可以看到玻璃窗格,我可以在他身上画画。

修改

好的,我现在有了我想要的东西。当我点击鼠标按钮时,我的玻璃窗格正在创建,当我释放此按钮时,它会消失。现在我有另一个问题。我应该在哪里创建我的绘画方法。我希望使用鼠标拖动在这个玻璃窗格上绘制矩形。我必须在哪里实施绘画方法?在其他课程还是在这个活动中?我实现了一个我的尝试绘画功能,但我不知道这是否是好方法。这是我的代码:

public class Selection extends JPanel
{
    static Point startPoint;
    public static void GUI()
    {

        final JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JButton button = new JButton("Select");
        final JPanel glassPane = new JPanel();


        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.add(button);
        glassPane.setOpaque(false);
        frame.add(panel);


        frame.setGlassPane(glassPane);
        glassPane.addMouseListener(new MouseAdapter()
        {

            @Override
            public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                System.out.println("f.getGlassPane() mousePressed");
                if(e.getButton() == MouseEvent.BUTTON1)


                frame.getGlassPane().setVisible(true);

                startPoint=e.getPoint();

                Graphics2D g = null;
                Graphics2D g2 = (Graphics2D) g;
                Rectangle2D rect = new Rectangle2D.Double();
                rect.setFrameFromDiagonal(e.getPoint().x, e.getPoint().y,startPoint.x, startPoint.y);
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F));
                g2.setColor(Color.BLUE);
                g2.fill(rect);
                g2.draw(rect);

            }

        });
        glassPane.addMouseMotionListener(new MouseMotionListener() {


            @Override
            public void mouseDragged(MouseEvent e) 
            {


            }

            @Override
            public void mouseMoved(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });

        frame.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent e)
            {
                super.mousePressed(e);
                if(e.getButton() == MouseEvent.BUTTON1)

                frame.getGlassPane().setVisible(true);

            }
            public void mouseReleased(MouseEvent e)
            {                     
                    frame.getGlassPane().setVisible(false);
            }
        });



        frame.setVisible(true);
    }


        int x1, x2, y1,y2;
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D)g;
             g2.drawRect(x1,y1, x2, y2);
        }


    public static void main(String[] args) 
    {

        GUI();
    }

}

2 个答案:

答案 0 :(得分:2)

嗨请check out my answer to some other question我提供了一种方法,可以使用玻璃窗格模拟对话行为。在那里你已经展示了如何显示它并在鼠标点击鼠标单击时隐藏它。这个例子可以让你很好地开始。

答案 1 :(得分:1)

我发现创建一个玻璃板并将其从RootPaneContainer方法内部附加到moussePressed()没有问题。

但是,我可能想知道为什么每次用户点击鼠标时都会创建一个新的玻璃窗格;这不会很有效;在前面创建并附加一个玻璃窗格然后在鼠标单击期间更改其内容可能更明智。

现在,关于“在玻璃窗上绘画”,它取决于你的“绘画”是什么意思,如果这意味着使用“Graphics”实例来直接绘制玻璃窗格,答案是否定的(好吧,实际上你可以,但是,你的绘画会在首次刷新UI时消失......)

此类绘画必须在您的玻璃窗格的paintComponent()方法中进行(您必须覆盖)。