Java полупрозрачный блок выбора - PullRequest
2 голосов
/ 29 апреля 2009

Для пользовательского рендеринга я создал класс, который расширяет JPanel и переопределяет метод paintComponent. В пользовательском paintComponent я рендерил несколько объектов формы, содержащихся в массиве. Я хотел бы добавить возможность перетаскивания и выбора 1 или более фигур. При перетаскивании я хотел бы показать полупрозрачный прямоугольник, определяющий область выделения, похожую на то, что видно в проводнике Windows. Может ли кто-нибудь обеспечить отправную точку для достижения этой цели?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 29 апреля 2009

Я видел интересный способ сделать это в исходном коде JFreeChart. Вы можете нарисовать область над участком диаграммы, и когда вы отпустите кнопку мыши, диаграмма увеличится на выбранном значении. Повторная визуализация графика обходится дорого, и, к сожалению, JFreeChart не поддерживает частичное рисование графика. Таким образом, чтобы нарисовать выделение, они выполняют некоторую побитовую операцию с цветами компонента обратимым образом. Каждый раз, когда мышь перемещается при выборе области, вы отменяете предыдущую побитовую операцию со старыми координатами, а затем возвращаете ее в новые координаты.

Взгляните на ChartPanel.java в 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();
}
1 голос
/ 29 апреля 2009

All

Спасибо за предложения. Закончилось решение этой проблемы путем адаптации некоторого кода, используемого в этой довольно умной демонстрации. 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 голос
/ 29 апреля 2009

Вы можете использовать JXLayer . Распространите это через всю форму и сделайте живопись в таможне LayerUI.

0 голосов
/ 29 апреля 2009

Для некоторых компонентов (я не знаю, относится ли это к вашим компонентам при перетаскивании), вы можете установить фон и использовать «прозрачный цвет»

Класс Color реализует прозрачность.

Чтобы использовать его, вы можете указать альфа-значение в конструкторе Color.

Например, это полупрозрачный черный фон:

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

См. [Конструктор] [1]

Опять же, я не уверен, относится ли это к вам. Попробуйте

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

0 голосов
/ 29 апреля 2009

Конечно, вот простой пример с методами создания и перемещения фигуры.

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)
     }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...