1

描画に問題があります。ボタンが1つ付いたフレームがあります。マウスを使用して、半透明の長方形を描きます。しかし、この四角形を描画するとボタンの後ろに描画され、この四角形をボタンの上に配置したいので、小さな問題があります。

これはスクリーンショットです:

そして、これはコードです:

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

    }

}

どうすればこの問題を解決できますか?

4

3 に答える 3

4

ボタンの背後にあるパネルに四角形を描画します。(下位のコンポーネントを子コンポーネントの上に描画させる方法はありません。)四角形をボタンの上に配置する必要がある場合は、描画しているコンポーネントをボタンの上に配置する必要があります。(ただし、このようなコンポーネントは不透明である必要があります。不透明であると、常にボタンが覆われ、ボタンが表示されないためです。

フレーム全体の上にあるガラス板などに長方形を描くことをお勧めします。

于 2011-05-25T08:38:45.230 に答える
2

額縁から取れるガラス板に絵を描いてみませんか。その方法については、チュートリアルを参照してください。

JPanel を拡張するクラスにすべての描画コードを含める必要があります。次に、オブジェクトを作成し、フレームのガラス板として設定します。さらに、デフォルトでは非表示になっているため、表示するように設定することを忘れないでください。

于 2011-05-25T08:42:51.393 に答える
1

通常、カスタム ペイントは、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);
    }
于 2011-05-26T01:17:31.780 に答える