Java выбрать элементы - PullRequest
       1

Java выбрать элементы

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

Я только начал свое приключение с Java. Я написал приложение с панелью и тремя кнопками. Но у меня есть проблема. Я хочу добавить выделение этой кнопки с помощью мыши. Я имею в виду, как у нас в Windows на рабочем столе. Я нажимаю левую кнопку мыши и с движением мыши выделение области увеличивается. И у меня есть вопрос. Есть ли определенный интерфейс в этом или у меня есть его вручную, вызовите соответствующие методы для слушателей событий, и там нарисовать прозрачный прямоугольник? Вот картинка: enter image description here

Я добился определенного прогресса, но у меня другая проблема. Все хорошо, но когда я рисую прямоугольник, кнопка перерисовывается. Я хочу, чтобы эта кнопка не исчезала, когда я рисую прямоугольник. Это код:

    import java.awt.AlphaComposite;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class zaznacz extends JPanel implements MouseListener, MouseMotionListener
{


     Rectangle newLine=null;
     public zaznacz() 
     {

            addMouseListener(this);
            addMouseMotionListener(this);

        }


        static class Rectangle {

            int x1,y1,x2,y2;

            Rectangle(int _x1, int _y1,int _x2, int _y2){

                x1=_x1;y1=_y1;x2=_x2;y2=_y2;
            }



             void paint(Graphics g)
             {



                 g.drawRect(x1, y1, x2, y2);


            }

        }
        public void mouseClicked(MouseEvent e) {

                }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        @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 mouseReleased(MouseEvent e) 
        {
            repaint();

        }
        Point startPoint;


        @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);


        }
        @Override
        public void mouseMoved(MouseEvent e) {


        }
        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);


            }
        });
    }

}

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Редактировать: если вы ссылаетесь на выделенный прямоугольник, такой как тот, который появляется при перетаскивании мышью на рабочий стол, то ваш подход, безусловно, будет действительным и осуществимым; Я не верю, что в Swing есть какие-либо функции, которые обеспечивают реализацию этой функции. Я не знаю, поддерживает ли JDesktop это, но это может стоить посмотреть.

Редактировать 2: Также взгляните на Стеклянная панель . Было бы намного удобнее реализовать то, что вы описываете, чем делать все на одной панели.

Если я правильно понимаю ваш вопрос, эффекты, возникающие при наведении или нажатии на кнопку, контролируются Look and Feel (L & F). Вы можете выбрать нужный стиль и стиль среди тех, которые доступны в операционной системе хоста, используя класс javax.swing.UIManager. Написание собственного внешнего вида - это нетривиальная задача, которая обычно занимает несколько недель, даже для человека, который имеет опыт использования приложений для редактирования изображений и знает, как программировать графический пользовательский интерфейс.

Вот пример (из этой ссылки ), который показывает вам, как изменить L & F на Nimbus:

try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(info.getName())) {
        UIManager.setLookAndFeel(info.getClassName());
        break;
    }
}
} catch (Exception e) {
    // If Nimbus is not available, you can set the GUI to another look and feel.
}

Есть много других доступных, но стоит отметить, что многие разработчики (и пользователи) предпочитают использовать внешний вид и поведение системы по умолчанию, а не тот, который по умолчанию для компонентов Java Swing.

0 голосов
/ 14 апреля 2011

Я думаю, что подход GlassPane не самый подходящий в этом случае.Было бы намного лучше создать подкласс JPanel и переопределить метод paintComponent ().Таким образом, поскольку вы создаете подклассы JPanel, вы также можете управлять дочерними объектами или кодировать какое-то нестандартное поведение, которое должна иметь ваша панель, вероятно, связанное с дочерними элементами.

Выполните рисование следующим образом:

@override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g.create();
    //Your painting code here
    g2.dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...