Java Swing и проблема рисования - PullRequest
1 голос
/ 25 мая 2011

У меня проблема с рисованием. У меня есть рамка с одной кнопкой. Используя мышь, я рисую прозрачный прямоугольник. Но у меня есть небольшая проблема, потому что при рисовании этого прямоугольника он рисует за кнопкой, и я хочу, чтобы этот прямоугольник был над кнопкой.

Это скриншот:

А это код:

package draw;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;


public class Selection extends JPanel
    implements  ChangeListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static final int WIDE = 640;
    private static final int HIGH = 640;  
    private List<Node> nodes = new ArrayList<Node>();
    private Point mousePt = new Point(WIDE / 2, HIGH / 2);
    private Rectangle mouseRect = new Rectangle();
    private boolean selecting = false;

    public static void main(String[] args) throws Exception {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame f = new JFrame("GraphPanel");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Selection gp = new Selection(); 
                f.add(new JScrollPane(gp), BorderLayout.CENTER);                
                f.pack();
                f.setVisible(true);
            }
        });
    }

    Selection() {
        JButton but=new JButton("Button");
        add(but);

        this.setPreferredSize(new Dimension(WIDE, HIGH));      
        this.addMouseListener(new MouseHandler());
        this.addMouseMotionListener(new MouseMotionHandler());
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(new Color(0x00f0f0f0));
        g.fillRect(0, 0, getWidth(), getHeight());


            g.setColor(Color.BLACK);
            ((Graphics2D) g).setComposite(AlphaComposite.getInstance(rule, alpha));
            g.fillRect(mouseRect.x, mouseRect.y,
                    mouseRect.width, mouseRect.height);

            g.drawRect(mouseRect.x, mouseRect.y,
                mouseRect.width, mouseRect.height);

    }
    int rule = AlphaComposite.SRC_OVER;
    float alpha = 0.85F;


    private class MouseHandler extends MouseAdapter {

        @Override
        public void mouseReleased(MouseEvent e) {
            selecting = false;
            mouseRect.setBounds(0, 0, 0, 0);
            if (e.isPopupTrigger()) {

            }
            e.getComponent().repaint();
        }

        @Override
        public void mousePressed(MouseEvent e) {
            mousePt = e.getPoint();

                Node.selectNone(nodes);
                selecting = true;          
            e.getComponent().repaint();
        }      
    }

    private class MouseMotionHandler extends MouseMotionAdapter {


        @Override
        public void mouseDragged(MouseEvent e) {
            if (selecting) {
                mouseRect.setBounds(
                    Math.min(mousePt.x, e.getX()),
                    Math.min(mousePt.y, e.getY()),
                    Math.abs(mousePt.x - e.getX()),
                    Math.abs(mousePt.y - e.getY()));

            } 
            e.getComponent().repaint();
        }
    }



    /** A Node represents a node in a graph. */
    private static class Node {

        private Color color;

        private boolean selected = false;
        private Rectangle b = new Rectangle();

        /** Draw this node. */
        public void draw(Graphics g) {
            g.setColor(this.color);

            if (selected) {
                g.setColor(Color.darkGray);
                g.drawRect(b.x, b.y, b.width, b.height);
            }
        }




       /** Mark this node as slected. */
         public void setSelected(boolean selected) {
            this.selected = selected;
        }

        /** Select no nodes. */
        public static void selectNone(List<Node> list) {
            for (Node n : list) {
                n.setSelected(false);
            }
        }
  }



    @Override
    public void stateChanged(ChangeEvent arg0) {
        // TODO Auto-generated method stub

    }

}

Как я могу решить эту проблему?

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

Вы рисуете прямоугольник на панели, которая находится позади кнопки.(Невозможно позволить нижележащему компоненту рисовать поверх дочернего компонента.) Если прямоугольник должен быть сверху кнопки, компонент, на котором вы рисуете, должен быть сверху кнопки.(Однако такой компонент должен быть непрозрачным, поскольку, если бы он был непрозрачным, он всегда закрывал бы кнопку, а кнопка не была бы видна.

Я бы посоветовал нарисовать прямоугольник на некотором стекле.панель или что-то, что лежит сверху всего кадра.

2 голосов
/ 25 мая 2011

Почему бы вам не сделать рисунок на стеклянной панели, который вы можете получить из рамы.Чтобы узнать, как это сделать, ознакомьтесь с учебным пособием.

У вас должен быть весь код рисования в классе, расширяющем JPanel.Затем создайте объект и установите его как стеклянную панель вашего кадра.Кроме того, вы должны помнить, чтобы он был видимым, поскольку он скрыт по умолчанию.

1 голос
/ 26 мая 2011

Обычно пользовательское рисование выполняется путем переопределения метода paintComponent (). Таким образом, порядок рисования состоит в том, чтобы покрасить компонент, а затем дети окрашены. Так что кнопка нарисована сверху прямоугольника.

В этом случае вы хотите, чтобы прямоугольник рисовался после дочерних элементов, поэтому вы можете сделать это, переопределив метод paint (). Теперь панель и ее дети будут окрашены. Тогда ваш прямоугольник будет нарисован так, что он будет нарисован поверх кнопки.

Итак, ваш основной код должен быть:

    @Override
    public void paint(Graphics g)
    {
        super.paint(g); // added this

        g.setColor(new Color(0x00f0f0f0));
//      g.fillRect(0, 0, getWidth(), getHeight());

        g.setColor(Color.BLACK);
        ((Graphics2D) g).setComposite(AlphaComposite.getInstance(rule, alpha));
        g.fillRect(mouseRect.x, mouseRect.y, mouseRect.width, mouseRect.height);
        g.drawRect(mouseRect.x, mouseRect.y, mouseRect.width, mouseRect.height);
    }
...