Нарисуйте круг при нажатии кнопки - PullRequest
0 голосов
/ 10 декабря 2018

Я очень новичок в Java и хотел бы нарисовать круг при нажатии кнопки.

Пока у меня есть кружок, и у меня отображается кнопка, но я не могу заставить ее работать.

Круг не появляется.Когда я добавляю еще один setVisible (true);в действии «Выполнено» кнопка будет работать и отображать мой круг, но в верхней части окна появится еще одна кнопка.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;

public class circle extends JFrame{

public circle (){
    super("Making a Circle");
    setSize(400,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    BorderLayout bord = new BorderLayout();

    //creating a button
    JButton draw = new JButton("draw");
    draw.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event){
            circleFrame cf = new circleFrame();
            add(cf, BorderLayout.CENTER);

        }
    });

    add(draw, BorderLayout.SOUTH);
    setVisible(true);

 }

 public static void main(String[] arguments){
    circle main = new circle();
 }

}

class circleFrame extends JPanel{
    public circleFrame(){
    }

    public void paintComponent(Graphics comp){
        Graphics2D comp2D = (Graphics2D) comp;
        comp2D.setColor(Color.black);
        comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
RenderingHints.VALUE_ANTIALIAS_ON);
        Ellipse2D.Float circle = new Ellipse2D.Float(10F, 10F, 100F, 100F);
        comp2D.fill(circle);

    }
}

1 Ответ

0 голосов
/ 10 декабря 2018

Пожалуйста, просмотрите, отметьте комментарии и запустите:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Circle extends JFrame{

    private boolean isDraw = false;
    private CircleFrame cf;
    private JButton draw;

    public Circle (){ // see Java Naming Conventions https://www.geeksforgeeks.org/java-naming-conventions

        super("Making a Circle");
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BorderLayout bord = new BorderLayout(); //you never use bord
        setLayout(bord);  //BTW BorderLayout is the default for JFrame content pane

        //you do not want to add a new panel with every button click so it
        //should NOT be triggered by the action listener
        cf = new CircleFrame();
        add(cf, BorderLayout.CENTER);

        //creating a button
        draw = new JButton("Draw");
        draw.addActionListener(event ->  toggleDrawErase() );
        //you also need to add the button
        add(draw, BorderLayout.PAGE_END);

        pack();
        setVisible(true);
    }


    private void toggleDrawErase() {
        isDraw = ! isDraw;
        cf.setDraw(isDraw);
        draw.setText(isDraw ?  "Erase" : "Draw");
        repaint();
    }

    public static void main(String[] arguments){
        new Circle();
    }
}

class CircleFrame extends JPanel{

    private boolean isDraw = false;

    public CircleFrame(){

        setPreferredSize(new Dimension(250, 300));
    }

    @Override
    public void paintComponent(Graphics comp){
        super.paintComponent(comp);
        if(! isDraw() ) return;  
        Graphics2D comp2D = (Graphics2D) comp;
        comp2D.setColor(Color.black);
        comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        Ellipse2D.Float circle = new Ellipse2D.Float(10F, 10F, 100F, 100F);
        comp2D.fill(circle);
    }

    boolean isDraw() {  return isDraw;  }

    void setDraw(boolean isDraw) {  this.isDraw = isDraw;   }
}

Не стесняйтесь обращаться за разъяснениями по мере необходимости.

...