Создание стекла - PullRequest
       22

Создание стекла

2 голосов
/ 13 мая 2011

У меня есть вопрос. Можно ли создать стекло в корпусе MousePressed? Если да, кто-нибудь может написать мне, как? Я имею в виду, что я нажимаю кнопку мыши, и видна стеклянная панель, и я могу рисовать на нем.

EDIT

Хорошо, теперь у меня есть то, что я хочу. Моя стеклянная панель создается, когда я нажимаю кнопку мыши, и исчезаю, когда я отпускаю эту кнопку. Теперь у меня есть другой вопрос. Где я должен создать свой метод рисования. Я хочу нарисовать прямоугольник на этой стеклянной панели с помощью мыши. Где я должен реализовать метод рисования? В другом классе или в этих событиях? Я реализую одну из своих функций рисования, но не знаю, насколько это хорошо. Это мой код:

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 ]

2 голосов
/ 13 мая 2011

Привет, пожалуйста посмотрите мой ответ на другой вопрос , где я представляю способ использования стеклянной панели для имитации поведения в диалоге. Там вы показали, как показать это и скрыть его по щелчку мыши, в моем случае щелчок правой кнопкой мыши. Этот пример должен хорошо начать.

1 голос
/ 13 мая 2011

Не вижу проблем с созданием стеклянной панели и прикреплением ее к методу RootPaneContainer изнутри moussePressed().

Однако я могу задаться вопросом, зачем создавать новую стеклянную панель каждый раз, когда пользователь щелкает мышью;это не было бы очень производительным;вероятно, целесообразнее создать и прикрепить стеклянную панель впереди, а затем изменить ее содержимое во время щелчка мыши).

Теперь, что касается " рисования на стеклянной панели ", это зависит от того, что вы подразумеваете под" рисованием ", если это означает использование экземпляра" Graphics "для непосредственного рисования на стеклянной панели, ответ НЕТ (ну, на самом деле вы могли бы, но ваша картина сначала исчезла бы)Обновление интерфейса ...)

Такое рисование должно происходить в методе paintComponent() вашей стеклянной панели (который необходимо переопределить).

...