2009-04-28 4 views
2

Für das benutzerdefinierte Rendering habe ich eine Klasse erstellt, die JPanel erweitert und die paintComponent-Methode überschreibt. In der benutzerdefinierten paintComponent I rendering mehrere Shape-Objekte in einem Array. Was ich hinzufügen möchte, ist die Möglichkeit, eine oder mehrere der Formen zu ziehen und auszuwählen. Während des Ziehens möchte ich ein durchsichtiges Rechteck zeigen, das den Auswahlbereich ähnlich wie im Windows Explorer definiert. Kann irgendjemand einen Ausgangspunkt dafür liefern?Java transluzente Auswahlbox

Danke.

Antwort

1

Alle,

Danke für die Vorschläge. Es endete damit, dass wir den Code, der in dieser ziemlich cleveren Demo verwendet wurde, angepasst haben. 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(); 
     } 
    } 
} 
1

Sie könnten JXLayer verwenden. Spannen Sie es über das ganze Formular und machen Sie das Gemälde in einer benutzerdefinierten LayerUI.

0

Sicher, hier ist ein einfaches Beispiel mit Methoden zum Erstellen und Verschieben der Form.

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) 
    } 
    } 
} 
0

Für einige Komponenten (ich weiß nicht, ob dies während Sie Ihre Komponenten anwenden gezogen wird) können Sie den Hintergrund einstellen und verwenden, um eine „transparente Farbe“

Die Color-Klasse tut implementiert Transparenz.

Um es zu verwenden, können Sie den Alpha-Wert im Color-Konstruktor angeben.

Zum Beispiel ist dies ein halbtransparenten schwarzen Hintergrund:

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

Siehe [Konstruktor] [1]

Noch einmal, ich bin mir nicht sicher, ob dies auf Sie zutrifft. Versuchen Sie es einfach

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

2

sah ich eine interessante Art und Weise diese Quellcode in JFreeChart zu tun. Sie können einen Auswahlrahmen über einen Bereich des Diagramms zeichnen, und wenn Sie die Maustaste loslassen, zoomt das Diagramm auf den ausgewählten Bereich heran. Das erneute Rendern des Diagramms ist teuer und JFreeChart unterstützt leider keine Teilfarben eines Diagramms. Um also das Markierfeld zu zeichnen, führen sie eine bitweise Operation der Farben der Komponente auf reversible Weise durch. Jedes Mal, wenn sich die Maus bei Auswahl eines Lauftextes bewegt, kehren Sie die vorherige bitweise Operation für die alten Koordinaten um und wiederholen sie an den neuen Koordinaten.

Werfen Sie einen Blick auf ChartPanel.java in JFreeChart

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