paintComponent()和paint()-使用装饰器模式绘制JButton

问题描述 投票:0回答:1

我找到了带有Swing组件的装饰器模式示例。以下代码在JFram上绘制了三个按钮。其中一个按钮带有斜杠,并使用Decorator模式实现。原始的有paint()方法,但是我用paintComponent(Grphaics g)替换了paint(),然后它无法在按钮上绘制线条。是否可以使用paintComponent()代替paint()?如果可能的话该怎么做?这个审判有什么问题?我缺少什么?

原始代码链接为http://www.java2s.com/Code/Java/Design-Pattern/DecoratorpatterninJava.htm

谢谢。

public class DecoWindow extends JFrame implements ActionListener {
    JButton Quit;

    public DecoWindow() {
        super("Deco Button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel jp = new JPanel();

        getContentPane().add(jp);
        jp.add(new CoolDDecorator(new JButton("Cbutton")));
        jp.add(new SlashDDecorator(new CoolDDecorator(new JButton("Dbutton"))));        
        jp.add(Quit = new JButton("Quit"));
        Quit.addActionListener(this);
        setSize(new Dimension(200, 100));
        setVisible(true);
        Quit.requestFocus();
    }

    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }

    public static void main(String argv[]) {
        new DecoWindow();
    }
}

class DDecorator extends JComponent {
    public DDecorator(JComponent c) {
        setLayout(new BorderLayout());
        add("Center", c);
    }
}

class SlashDDecorator extends DDecorator {
    int x1, y1, w1, h1;

    public SlashDDecorator(JComponent c) {
        super(c);
    }

    public void setBounds(int x, int y, int w, int h) {
          x1 = x; y1 = y;
          w1 = w; h1 = h;
          super.setBounds(x, y, w, h);
    }

    public void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2d = (Graphics2D) g;
          g2d.setColor(Color.red);
          g2d.drawLine(0, 0, w1, h1);
    }
}

class CoolDDecorator extends DDecorator {
    boolean mouse_over; //true when mose over button

    JComponent thisComp;

    public CoolDDecorator(JComponent c) {
        super(c);
        mouse_over = false;
        thisComp = this; //save this component
        //catch mouse movements in inner class
        c.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) {
                mouse_over = true; //set flag when mouse over
                thisComp.repaint();
            }

            public void mouseExited(MouseEvent e) {
                mouse_over = false; //clear flag when mouse not over
                thisComp.repaint();
            }
        });
    }

    //paint the button
    public void paintComponent(Graphics g) {
        super.paintComponent(g); //first draw the parent button
        Graphics2D g2d = (Graphics2D) g;

        //if the mouse is not over the button
        //erase the borders
        if (!mouse_over) {
            Dimension size = super.getSize();
            g2d.setColor(Color.lightGray);
            g2d.drawRect(0, 0, size.width - 1, size.height - 1);
            g2d.drawLine(size.width - 2, 0, size.width - 2, size.height - 1);
            g2d.drawLine(0, size.height - 2, size.width - 2, size.height - 2);
        }
    }
}

swing design-patterns decorator paint paintcomponent
1个回答
0
投票

[paint()先呼叫paintComponent(),然后再呼叫paintChildren()。您的组件正在绘制斜线并从paintComponent()返回。然后,默认的paint()实现继续进行,最终绘制了孩子,这些孩子是那些按钮,然后将它们画在斜杠的顶部。

为什么仍要使用paintComponent()

© www.soinside.com 2019 - 2024. All rights reserved.