Java选择项目

时间:2011-04-13 07:56:04

标签: java swing awt

我刚开始用java进行冒险。我用面板和三个按钮编写了一个应用程序。但我有一个问题。我想使用鼠标添加选择此按钮。我的意思是我们在桌面上的Windows中。我按下鼠标左键,随着鼠标的移动,区域选择也在增长。我有一个问题。是否有一个特定的接口或我是否有它manualy,为事件监听器调用适当的方法,并绘制透明矩形?这是一张图片: 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 个答案:

答案 0 :(得分:1)

编辑:如果您指的是突出显示的矩形,例如将鼠标拖到桌面上时出现的矩形,那么您的方法肯定是有效且可行的;我不相信Swing中提供此功能的任何功能。我不知道JDesktop是否支持这一点,但值得一看。

编辑2:另请查看GlassPane。它可以使您实现所描述的内容比在同一窗格中执行所有操作更方便。

如果我正确理解你的问题,当按钮被悬停或按下时产生的效果由外观(L& F)控制。您可以使用javax.swing.UIManager类选择主机操作系统中可用的外观。编写自己的外观和感觉是一项非常重要的任务,通常需要几周的时间,即使对于使用图像编辑应用程序并且知道如何编程图形用户界面的人也是如此。

以下是一个示例(来自this link),其中显示了如何将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组件的默认外观。

答案 1 :(得分:0)

我认为GlassPane方法在这种情况下不是最合适的。继承JPanel并覆盖paintComponent()方法会好得多。这样,当您为JPanel创建子类时,您也可以控制子项,或者编写面板应该具有的某种自定义行为,可能与子项相关。

绘画如下:

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