Рисование поля выбора с использованием Swing - PullRequest
1 голос
/ 20 апреля 2011

Я написал приложение с панелью и тремя кнопками. Я хочу добавить выделение этой кнопки с помощью мыши. Я имею в виду, как у нас в 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

Мне не нужен совет типа "ваш код неверен". Я знаю это и хочу, чтобы кто-нибудь помог мне, что я должен исправить. Я знаю, что я не должен использовать paintComponent () в mouseEvents, но только так я могу рисовать прозрачный прямоугольник. Или, может быть, вы можете представить, как я могу нарисовать прозрачный прямоугольник. Я пытаюсь, и я думаю, что я должен изменить метод mouseDragged. потому что когда я удаляю код из этого метода и рисую только прямоугольник над кнопкой, все в порядке. Но проблема в том, когда мне нужно нарисовать прямоугольник, перетаскивая мышь. Я должен поменять краску, но понятия не имею, как. Кто-нибудь может мне помочь или попробовать помочь?

1 Ответ

2 голосов
/ 20 апреля 2011

Я думаю, что этот код не работает в этих формах (основной), возможно, кто-то отладит это для вас, пожалуйста, следуйте советам Джои.

хммм, очень оскорбительные слова, так или иначе, следует (учебник по Oracle Java)http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...