Попытка нарисовать круг в 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, и которое отображается.
Предложения:
- Не рисуйте прямо в JFrame, а скорее в
paintComponent(Graphics g)
переопределение метода JPanel, который удерживается и отображается в JFrame. Есть много причин для этого, но по одной, так какpaint(...)
Метод отвечает не только за рисование компонента, но и за его границы и дочерние элементы, это предотвратит возникновение проблем приpaint(...)
пытается рисовать детей GUI и границы. Это также поможет вашей анимации (что наверняка вы будете делать в ближайшее время) быть плавной, учитывая использование по умолчанию компонента Swing двойной буферизации. - Всегда звони
super.paintComponent(g)
метод в вашей JPanel'spaintComponent
переопределения. Это позволит Swing стирать изображения, которые нужно стереть. - Не создавайте два объекта Shapes, а только один. Это значительно упростит вещи и позволит вам установить значение диаметра одного и того же важного объекта.
- После изменения значения поля диаметра вызовите repaint в своем графическом интерфейсе, чтобы был вызван отображаемый JPanel's paintComponent.