Java选择项

| 我刚开始用Java冒险。我编写了一个带有面板和三个按钮的应用程序。但是我有一个问题。我想使用鼠标添加选择此按钮。我的意思是就像我们在Windows桌面上一样。我按下鼠标左键,随着鼠标的移动,区域选择在增加。我有一个问题。有没有特定的接口,还是我有手动接口,请为事件侦听器调用适当的方法并绘制透明矩形?这是一张图片: 我取得了一些进步,但是我还有另一个问题。一切都很好,但是当我绘制矩形时,按钮正在重新绘制。当我绘制矩形时,我希望此按钮不消失。这是代码:
    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);


            }
        });
    }

}
有人可以帮助我吗?     
已邀请:
编辑:如果您指的是突出显示的矩形,例如将鼠标拖动到桌面上时出现的矩形,那么您的方法肯定是有效且可行的;我认为Swing中没有任何功能可以实现此功能。我不知道JDesktop是否支持此功能,但值得一看。 编辑2:还要看一看GlassPane。与在同一窗格中执行所有操作相比,它可以更轻松地实现您描述的内容。 如果我正确理解了您的问题,则将鼠标悬停或按下按钮时产生的效果将由外观(L&F)控制。您可以使用“ 1”类在主机操作系统上可用的外观中选择所需的外观。编写自己的外观是一项艰巨的任务,即使对于使用图像编辑应用程序并知道如何对图形用户界面进行编程的人来说,通常也要花费数周的时间。 这是一个示例(来自此链接),向您展示如何将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组件的默认外观。     
我认为GlassPane方法在这种情况下不是最合适的。子类化JPanel并重写paintComponent()方法会更好。这样,在为JPanel子类化时,您还可以控制子项,或者编写面板应该具有的可能与子项有关的某种自定义行为。 按照以下步骤进行绘画:
@override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g.create();
    //Your painting code here
    g2.dispose();
}
    

要回复问题请先登录注册