简单的 Java 按钮来显示圆

发布于 2024-12-05 05:44:02 字数 2409 浏览 9 评论 0原文

我目前正在学习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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

尐籹人 2024-12-12 05:44:02

您正在使用 NewNode 的两个不同实例,

frame.getContentPane().add(new NewNode());
final NewNode newNode = new NewNode();

在操作侦听器中,您正在对未添加到内容窗格的 newNode 调用 newNode.drawCircle()

顺便说一句,您是否注意到您有两个 Circle 类,其中第一个类做了一些奇怪的事情(例如将一个新圆添加到它无法访问的 _circles 中)?

You are using two different instances of NewNode

frame.getContentPane().add(new NewNode());
final NewNode newNode = new 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)?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文