对于自定义渲染,我创建了一个扩展JPanel并覆盖paintComponent方法的类。在自定义paintComponent中,我渲染了数组中保存的多个形状对象。我想补充的是能够拖动和选择一个或多个形状。在拖动时,我想显示一个半透明的矩形,用于定义类似于Windows资源管理器中所见的选择区域。能否为实现这一目标提供一个起点?
感谢。
答案 0 :(得分:2)
我在JFreeChart的源代码中看到了一种有趣的方法。您可以在图表的某个部分上绘制选取框,当您释放鼠标时,图表会放大选定的部分。重新发布图表非常昂贵,遗憾的是JFreeChart不支持图表的部分绘制。因此,为了绘制选框,他们以可逆的方式对组件的颜色进行某种按位操作。每次鼠标在选择选取框时移动时,都会在旧坐标上反转先前的按位操作,然后在新坐标上重新执行该操作。
在JFreeChart
中查看ChartPanel.javaprivate 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)