Попытка нарисовать круг в Java, используя переменную в параметрах

У меня возникают проблемы с выполнением довольно простой задачи: определить диаметр круга и нарисовать его. Вот мой код до сих пор.

import javax.swing.*;
import java.awt.Graphics;

public class Shapes extends JFrame
{
    double diameter;

    public Shapes()
    {
        setSize(600,600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }


    public void getDiameter()
    {
        String input = JOptionPane.showInputDialog("What is the diameter of the circle?");
        diameter = Double.parseDouble(input);

        Shapes gui = new Shapes();
        gui.setVisible(true);
    }

    public static void main(String[] args) 
    {       
        Shapes app = new Shapes();
        app.getDiameter();
    }

    public void paint(Graphics canvas)
    {
        canvas.drawOval(50, 50, (int)diameter, (int)diameter);
    }

}

Когда я запускаю его, открывается окно Jframe, но ничего не рисуется, поэтому я предполагаю, что значение диаметра никогда не передается методу рисования. Может кто-нибудь помочь мне заставить это работать? Благодарю.

1 ответ

Решение

Ваша программа фактически создает два объекта Shapes, у одного из которых поле диаметра установлено правильно, но не отображается, а у другого - значение диаметра по умолчанию, равное 0, и которое отображается.

Предложения:

  1. Не рисуйте прямо в JFrame, а скорее в paintComponent(Graphics g) переопределение метода JPanel, который удерживается и отображается в JFrame. Есть много причин для этого, но по одной, так как paint(...) Метод отвечает не только за рисование компонента, но и за его границы и дочерние элементы, это предотвратит возникновение проблем при paint(...) пытается рисовать детей GUI и границы. Это также поможет вашей анимации (что наверняка вы будете делать в ближайшее время) быть плавной, учитывая использование по умолчанию компонента Swing двойной буферизации.
  2. Всегда звони super.paintComponent(g) метод в вашей JPanel's paintComponent переопределения. Это позволит Swing стирать изображения, которые нужно стереть.
  3. Не создавайте два объекта Shapes, а только один. Это значительно упростит вещи и позволит вам установить значение диаметра одного и того же важного объекта.
  4. После изменения значения поля диаметра вызовите repaint в своем графическом интерфейсе, чтобы был вызван отображаемый JPanel's paintComponent.
Другие вопросы по тегам