Java 如何在代码中使用paint方法显示按钮?

Java 如何在代码中使用paint方法显示按钮?,java,swing,paint,Java,Swing,Paint,我用JAVA编写了这段代码 ` public class Okno extends JFrame{ Pixel p; private int x_zac, y_zac, x_kon, y_kon; //zaciatoca a koncova pozicia ciary private int x_kruh, y_kruh; //suradnice kruhu int poc_ciar=0; // premenna na pocitanie poctu vytvorenych ciar int

我用JAVA编写了这段代码

`

public class Okno extends JFrame{
Pixel p;
private int x_zac, y_zac, x_kon, y_kon; //zaciatoca a koncova pozicia ciary
private int x_kruh, y_kruh; //suradnice kruhu
int poc_ciar=0;  // premenna na pocitanie poctu vytvorenych ciar
int cokreslim=0; // pomocna premenna na urcovanie kreslenia ciar=0 alebo kruhov=1

Canvas can = new Canvas();
JButton kruh = new JButton("kruh");
JButton ciara = new JButton("ciara");


GridBagConstraints c = new GridBagConstraints();
Kreslenie_vypocty vypocty = new Kreslenie_vypocty();

Okno(Pixel  p1){
    setSize(800, 700);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridBagLayout());
    setResizable(false);


    c.gridx = 0;
    c.gridy = 0;
    c.insets= new Insets(10, 10, 10, 10);
    add(kruh,c);
    c.gridx = 1;
    c.gridy = 0;
    c.insets= new Insets(10, 10, 10, 10);
    add(ciara,c);

    c.gridx = 2;
    c.gridy = 0;
    add(can,c);

    can.setSize(500,700);
    can.setBackground(Color.gray);



    can.addMouseListener(new MouseListener() {


        public void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
              x = x-(r/2);
              y = y-(r/2);
              g.fillOval(x,y,r,r);
            }

        public void mouseClicked(MouseEvent e) {
        }
        public void mouseExited(MouseEvent e) {

        }
        public void mouseEntered(MouseEvent e) {
        } 
        public void mousePressed(MouseEvent e) {
            p.c.add(new Ciara());
            x_zac = e.getX();
            y_zac = e.getY();  
        }

        public void mouseReleased(MouseEvent e) {
            x_kon = e.getX();
            y_kon = e.getY();
            repaint();
            vypocty.vypocet_bodov(x_zac, y_zac, x_kon, y_kon, p, poc_ciar);
            poc_ciar++; 
        }
    });
    //can.setVisible(true);

    p=p1;


    kruh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            cokreslim=1;
        }
    });

    ciara.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            cokreslim=0;
        }
    });


}   
public void paint(Graphics g){  
    g=can.getGraphics();
    g.setColor(Color.red);
    if (cokreslim==0)
        g.drawLine(x_zac,y_zac,x_kon,y_kon);
    else
        g.drawOval(x_zac-(50/2),y_zac-(50/2),50,50);}}`
当代码中有绘画方法时,按钮不显示。但是当我把它取下来的时候,一切都很好

屏风:用油漆法

无涂料法

。。。。。当我点击画布时,会显示一个按钮


谢谢

首先,您应该调用
super.paint(g)
…这非常重要,因为它的工作之一是绘制子组件

话虽如此,您应该避免重写
paint
,尤其是像
JFrame
这样的顶级容器,相反,您应该创建一个自定义组件,该组件从
JComponent
之类的扩展(例如
JPanel
),并重写它的
paintComponent
方法

您还应该避免对包含其他组件的组件进行绘制,例如,除非您计划绘制某种背景图像

相反,分开你的容器,这样你的画就不会在其他组件下结束…除非你是为了这个,否则你应该继续

请仔细查看和了解更多详细信息