Java选择项

Java选择项,java,swing,awt,Java,Swing,Awt,我刚开始我的java冒险。我已经编写了一个带有面板和三个按钮的应用程序。但我有个问题。我想用鼠标添加选择按钮。我的意思是,就像我们在桌面上的Windows一样。我按下鼠标左键,随着鼠标的移动,区域选择越来越多。我有个问题。这里面有没有一个特定的接口,或者我是否手动使用它,为事件监听器调用适当的方法,然后绘制透明的矩形?这是一张照片: 我取得了一些进步,但我还有一个问题。一切正常,但当我画矩形时,按钮正在重新绘制。我想在绘制矩形时,不要禁用此按钮。这是代码: import java.aw

我刚开始我的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中有任何特性提供了此特性的实现。我不知道是否支持这个,但它可能值得一看

编辑2:也看一看。与在同一个窗格中执行所有操作相比,实现您所描述的操作要方便得多

如果我正确理解了您的问题,则当按钮悬停或按下时产生的效果由外观(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组件的默认外观。

我认为GlassPane方法在这种情况下不是最合适的。最好将JPanel子类化并重写paintComponent()方法。这样,当您对JPanel进行子类化时,您也可以控制孩子们,或者编写您的面板应该具有的某种定制行为,可能与孩子们有关

按照以下步骤进行绘制:

@override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g.create();
    //Your painting code here
    g2.dispose();
}

我认为他不是这个意思。“[…]随着鼠标的移动,区域选择正在增加[…]”我以为他指的是鼠标悬停在按钮上时触发的发光效果,但我不太确定。我添加了一张图片以更好地理解Mehm。。。还是不明白,只是猜测一下:用鼠标在所有按钮周围拖动一个边框来选择几个按钮(或其他组件)?像橡皮筋之类的东西(不过,边界框的轮廓可以以某种方式填充)?是的。我想通过鼠标拖动选择几个按钮。感谢您的澄清:-)在core中不直接支持这样做,您必须自己实现它。如果您的面板被用作框架的内容窗格,那么glassPane是一个很好的选择(正如回答中已经建议的那样)。非常感谢。我会努力的,如果我成功了,我会在这里发布:)参见