简单的 Java 按钮来显示圆
我目前正在学习java,我理解除图形之外的概念,作为程序员,这对我来说是全新的。坦白说,它让我不知所措。理论上,我的示例应该在按下按钮时出现一个圆圈。
使用打印方法进行调试,我不断发现 Button 正确调用了所有方法并创建了一个新的 Circle c 对象,但在 newNode().drawCircle() 中,从未调用 repaint() ,因此未绘制新对象。这是为什么?有人可以帮我让这个该死的圆圈出现吗?有些人可能会注意到我求助于使用此示例来尝试帮助解决问题 http ://leepoint.net/notes-java/examples/graphics/circles/circles.html。
这本来是一个网络绘图程序的开始,我认为该程序很容易......除了在创建时显示节点......即圆!
这段代码现在可以工作了,所以我希望它可以帮助有类似问题的人,因为我知道这是一个常见的java作业:)
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
///////////////////////////////////////////////////////////////////////
public class NetGrapher
{
public static void main(String[] args){
final JFrame frame = new JFrame ("NetGrapher");
frame.getContentPane().add(new NewNode()); /////delete line
final NewNode newNode = new NewNode();
///// Revision after answer, add, frame.getContentPane().add(newNode); (erase the above frame.getContent)
JPanel buttonPanel = new JPanel();
JButton button = new JButton ("New Node");
button.addActionListener(new ActionListener( ){
public void actionPerformed( ActionEvent e) {
System.out.println( "Button Pressed");
newNode.drawCircle();
}
});
buttonPanel.add(button);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setSize(600,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//////////////////////////////////////////////////////////////////////
class NewNode extends JComponent
{
public ArrayList<Circle> _circles = new ArrayList<Circle>();
public void paintComponent(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0, 0, 600, 600);
System.out.println( "RePaint");
for ( Circle c : _circles){
System.out.println( "Each C");
g.setColor(Color.BLACK);
c.draw(g);
}
}
public void drawCircle(){
System.out.println( "drawCircle Implemented");
Circle c = new Circle(100, 100, 100, 100);
_circles.add(c);
repaint();
}
}
/////////////////////////////////////////////////////////////////////
class Circle
{
int x, y, z, a;
Circle (int _x, int _y, int _z, int _a){
this.x = _x;
this.y = _y;
this.z = _z;
this.a = _a;
}
public void draw(Graphics g){
System.out.println( "Called In Draw Method");
g.setColor(Color.BLACK);
g.fillOval(x, y, z, a);
}
}
I am currently learning java, I understand the concepts except Graphics which as a programmer is totally new to me. Quite frankly it is driving my around the bend. My example should in theory make a circle appear at the press of a Button.
Using print methods to debug I keep finding that the Button correctly called all the methods and creates a new circle c object but in the newNode().drawCircle() repaint() is never called and hence the new object not drawn. WHY IS THIS and can someone help me get this darn circle to appear!! Some may notice I resorted to using this example to try and help resolve the problem http://leepoint.net/notes-java/examples/graphics/circles/circles.html .
This was meant to be the start of a Network graphing program which i PRESUMED would be easy...except for displaying the nodes when created...i.e the circle!
This code now works so i hope it can help people with a similar problem, as i know this is a common java assignment :)
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
///////////////////////////////////////////////////////////////////////
public class NetGrapher
{
public static void main(String[] args){
final JFrame frame = new JFrame ("NetGrapher");
frame.getContentPane().add(new NewNode()); /////delete line
final NewNode newNode = new NewNode();
///// Revision after answer, add, frame.getContentPane().add(newNode); (erase the above frame.getContent)
JPanel buttonPanel = new JPanel();
JButton button = new JButton ("New Node");
button.addActionListener(new ActionListener( ){
public void actionPerformed( ActionEvent e) {
System.out.println( "Button Pressed");
newNode.drawCircle();
}
});
buttonPanel.add(button);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.setSize(600,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//////////////////////////////////////////////////////////////////////
class NewNode extends JComponent
{
public ArrayList<Circle> _circles = new ArrayList<Circle>();
public void paintComponent(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0, 0, 600, 600);
System.out.println( "RePaint");
for ( Circle c : _circles){
System.out.println( "Each C");
g.setColor(Color.BLACK);
c.draw(g);
}
}
public void drawCircle(){
System.out.println( "drawCircle Implemented");
Circle c = new Circle(100, 100, 100, 100);
_circles.add(c);
repaint();
}
}
/////////////////////////////////////////////////////////////////////
class Circle
{
int x, y, z, a;
Circle (int _x, int _y, int _z, int _a){
this.x = _x;
this.y = _y;
this.z = _z;
this.a = _a;
}
public void draw(Graphics g){
System.out.println( "Called In Draw Method");
g.setColor(Color.BLACK);
g.fillOval(x, y, z, a);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在使用
NewNode
的两个不同实例,在操作侦听器中,您正在对未添加到内容窗格的 newNode 调用
newNode.drawCircle()
。顺便说一句,您是否注意到您有两个
Circle
类,其中第一个类做了一些奇怪的事情(例如将一个新圆添加到它无法访问的 _circles 中)?You are using two different instances of
NewNode
In your action listener you're calling
newNode.drawCircle()
on newNode which was not added to a content pane.BTW have you noticed that you've got two
Circle
classes, where the first does some strange things (like adding a new circle into _circles which it cannot access)?