2011-04-13 172 views
2

我刚开始与java的冒险。我已经用面板和三个按钮编写了一个应用程序。但我有一个问题。我想用鼠标添加选择这个按钮。我的意思就像我们在桌面上的Windows一样。我按下鼠标左键并随着鼠标的移动,区域选择正在增加。我有一个问题。有没有在这个特定的接口,或者我有它manualy,调用事件侦听器的适当方法,并在那里绘制透明的矩形?这里是一张图片: enter image description hereJava选择项目

我做了一些进步,但我有另一个问题。一切都很好,但是当我画矩形时,按钮正在重新绘制。当我画矩形时,我想要这个按钮不会消失。这是代码:

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


      } 
     }); 
    } 

} 

有人可以帮我吗?

+0

什么是讲坛? – Fortega 2011-04-13 08:05:16

+0

嗯...仍然不明白,只是抛出一个猜测:选择_several_按钮(或其他组件)通过鼠标拖动一个边界矩形周围的所有?像橡皮筋一样(边框的轮廓,可以用某种方式填充)? – kleopatra 2011-04-13 08:47:39

+0

是的。我想通过鼠标拖动来选择几个按钮。 – edi233 2011-04-13 08:49:49

回答

1

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

编辑2:也看看GlassPane。它会使实现你所描述的要比在同一个窗格上做所有事情更方便。

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

下面是一个例子(从this link),这表明你如何更改为L & F到雨云:

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

我不认为这就是他的意思。 “[...]随着鼠标的移动区域选择越来越多[...]” – Fortega 2011-04-13 08:08:10

+0

我认为他指的是鼠标悬停在按钮上时触发的发光效果,但我不是太确定了。 – 2011-04-13 08:09:30

+0

我想我知道你的意思;我已经更新了我的答案。 – 2011-04-13 08:16:03

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