Java半透明选择框

时间:2009-04-28 20:29:45

标签: java

对于自定义渲染,我创建了一个扩展JPanel并覆盖paintComponent方法的类。在自定义paintComponent中,我渲染了数组中保存的多个形状对象。我想补充的是能够拖动和选择一个或多个形状。在拖动时,我想显示一个半透明的矩形,用于定义类似于Windows资源管理器中所见的选择区域。能否为实现这一目标提供一个起点?

感谢。

5 个答案:

答案 0 :(得分:2)

我在JFreeChart的源代码中看到了一种有趣的方法。您可以在图表的某个部分上绘制选取框,当您释放鼠标时,图表会放大选定的部分。重新发布图表非常昂贵,遗憾的是JFreeChart不支持图表的部分绘制。因此,为了绘制选框,他们以可逆的方式对组件的颜色进行某种按位操作。每次鼠标在选择选取框时移动时,都会在旧坐标上反转先前的按位操作,然后在新坐标上重新执行该操作。

在JFreeChart

中查看ChartPanel.java
private void drawZoomRectangle(Graphics2D g2) {
    // Set XOR mode to draw the zoom rectangle
    g2.setXORMode(Color.gray);
    if (this.zoomRectangle != null) {
        if (this.fillZoomRectangle) {
            g2.fill(this.zoomRectangle);
        }
        else {
            g2.draw(this.zoomRectangle);
        }
    }
    // Reset to the default 'overwrite' mode
    g2.setPaintMode();
}

答案 1 :(得分:1)

您可以使用JXLayer。将其跨越整个表单并使用自定义LayerUI进行绘制。

答案 2 :(得分:1)

所有

感谢您的建议。通过调整这个相当聪明的演示中使用的一些代码,结束解决这个问题。 http://forums.sun.com/thread.jspa?threadID=5299064&start=19

public class ExamplePanel extends JPanel
{
    Rectangle2D.Double selectionRect;
    Point mouseDown, mouseHere;

   ...

    protected void paintComponent(Graphics g)
    {
        AlphaComposite ta = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
        g2d.setComposite(ta);
        g2d.setColor(Color.BLUE);
        g2d.fill(selectionRect);
        g2d.setComposite(AlphaComposite.SrcOver);
        g2d.setColor(Color.BLACK);
        g2d.draw(selectionRect);
    }
}

public class ExammpleMouseListener extends MouseAdapter    
{    
    @Override
    public void mousePressed(MouseEvent e)
    {      
        super.mousePressed(e);

        // store the mouse down location
        pnl.mouseDown = e.getPoint();
    }

    /**
     * @see  java.awt.event.MouseAdapter#mouseDragged(java.awt.event.MouseEvent)
     */
    @Override
    public void mouseDragged(MouseEvent e)
    {
        super.mouseDragged(e);

        // check for left mouse button
        if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == 0)
        {
            return;
        }

        // store the current location
        pnl.mouseHere = e.getPoint();

        // calculate the size of the selection rectangle
        double downX = pnl.mouseDown.getX();
        double downY = pnl.mouseDown.getY();
        double hereX = pnl.mouseHere.getX();
        double hereY = pnl.mouseHere.getY();

        double l = Math.min(downX, hereX);
        double t = Math.min(downY, hereY);
        double w = Math.abs(downX - hereX);
        double h = Math.abs(downY - hereY);

        pnl.selectionRect = new Rectangle2D.Double(l, t, w, h);

        // queue a repaint of the panel
        pnl.repaint();
    }

    @Override
    public void mouseReleased(MouseEvent e)
    {
        super.mouseReleased(e);

        // clear the selection rectangle
        pnl.selectionRect = null;

        // queue a repaint of the panel
            pnl.repaint();
        }
    }
}

答案 3 :(得分:0)

当然,这是一个简单的例子,其中包含创建和移动形状的方法。

class MyShape implements Shape {

   private Shape shape;

   public void createShape(Point p1, Point p2, ShapeType t) {
      switch(t) {
        case RECTANGLE: {
           shape = new Rectangle2D.Double(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
           break;
        }
        ... (other shapes)
     }
  }

  public void moveShape(Point lastPoint, Point newPoint, ShapeType t) {
      int xOffset = newPoint.x - lastPoint.x;
      int yOffset = newPoint.y - lastPoint.y;
      switch(t) {
        case RECTANGLE: {
           double x1 = shape.getBounds().getX() + xOffset;
           double y1 = shape.getBounds().getY() + yOffset;
           double w = shape.getBounds().getWidth();
           double h = shape.getBounds().getHeight();
           shape = new Rectangle2D.Double(x1, y1, w, h);
           break;
        }
        ... (other shapes)
     }
  }
}

答案 4 :(得分:0)

对于某些组件(我不知道这是否适用于拖动时的组件),您可以设置背景并使用“透明色”

Color类确实实现了透明度。

要使用它,您可以在Color构造函数中指定alpha值。

例如,这是一个半透明的黑色背景:

         // 0: totally transparent 
         // 255: totally opaque, 
         // 192 semy transparent.
         this.setBackground(new Color( 0, 0, 0, 192 )); 

参见[constructor] [1]

同样,我不确定这是否适用于你。试一试

[1]:http://java.sun.com/javase/6/docs/api/java/awt/Color.html#Color(int,int,int,int)