为什么按下按钮号8时图形不起作用?

时间:2013-10-07 03:12:21

标签: java swing

我有这个代码,它可以处理所有内容,直到按下底部中间按钮。

import java.awt.*;

import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JLabel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class memory extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.setColor(new Color(156, 93, 82));
        g.fill3DRect(21, 3, 7, 12, true);
        g.setColor(new Color(156, 23, 134));
        g.fillOval(1, 15, 15, 15);
        g.fillOval(16, 15, 15, 15);
        g.fillOval(31, 15, 15, 15);
        g.fillOval(7, 31, 15, 15);
        g.fillOval(22, 31, 15, 15);
        g.fillOval(16, 47, 15, 15);
    }

    public memory() {

        GridLayout h = new GridLayout(3, 3);
        final JFrame frame = new JFrame();
        final JPanel pan = new JPanel(h);
        frame.add(pan);
        //pan=new JPanel(h);
        pan.setBackground(new Color(130, 224, 190));
        setFont(new Font("Serif", Font.BOLD, 28));
        JButton button1 = new JButton();
        pan.add(button1);
        final JLabel label1 = new JLabel("hi");
        label1.setVisible(false);
        pan.add(label1);
        JButton button2 = new JButton();
        pan.add(button2);
        final JLabel label2 = new JLabel("hi");
        label2.setVisible(false);
        pan.add(label2);
        JButton button3 = new JButton();
        pan.add(button3);
        final JLabel label3 = new JLabel("hi");
        label3.setVisible(false);
        pan.add(label3);
        JButton button4 = new JButton();
        pan.add(button4);
        final JLabel label4 = new JLabel("hi");
        label4.setVisible(false);
        pan.add(label4);
        JButton button5 = new JButton();
        pan.add(button5);
        final JLabel label5 = new JLabel("hi");
        label5.setVisible(false);
        pan.add(label5);
        JButton button6 = new JButton();
        pan.add(button6);
        final JLabel label6 = new JLabel("hi");
        label6.setVisible(false);
        pan.add(label6);
        JButton button7 = new JButton();
        pan.add(button7);
        final JLabel label7 = new JLabel("hi");
        label7.setVisible(false);
        pan.add(label7);
        JButton button8 = new JButton();
        pan.add(button8);
        final JLabel label8 = new JLabel("hi");
        label8.setVisible(false);
        pan.add(label8);
        JButton button9 = new JButton();
        pan.add(button9);
        final JButton button10 = new JButton("Exit");
        pan.add(button10);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("memory Game");
        setLayout(new BorderLayout());
        add(pan, BorderLayout.CENTER);
        add(button10, BorderLayout.SOUTH);
        setSize(600, 600);
        setVisible(true);
        final JLabel label9 = new JLabel("hi");
        label9.setVisible(false);
        pan.add(label9);
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label1.setVisible(true);
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label2.setVisible(true);
            }
        });
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label3.setVisible(true);
            }
        });
        button4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label4.setVisible(true);
            }
        });
        button5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label5.setVisible(true);
            }
        });
        button6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label6.setVisible(true);
            }
        });
        button7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label7.setVisible(true);
            }
        });
//this is where I thought it was going to do something if it was pressed.
        button8.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label8.setVisible(true);
                frame.getContentPane().add(new memory());
                setVisible(true);

            }
        }
                );
        button9.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                label9.setVisible(true);
            }
        }
                );
        button10.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (button10.getSize() != null) {
                    System.exit(0);
                }
            }
        });

    }

    public static void main(String args[]) {
        new memory();
    }

}

1 个答案:

答案 0 :(得分:1)

memory延伸JFrame。 Swing不允许您将窗口添加到另一个窗口。

你应该避免从顶级容器扩展(这只是原因),而是使用像JPanel这样的东西。

这允许您将组件添加到您喜欢的任何容器

JFrame没有paintComponent方法,因此永远不会被调用。它编译的原因是你打电话给super.paintComponents(注意最后的s)。

相反,你应该从JPanel扩展并覆盖它的paintComponent方法并从那里执行自定义绘画