Просто кнопка Java для отображения круга - PullRequest
3 голосов
/ 17 сентября 2011

Я в настоящее время изучаю Java, я понимаю концепции, кроме графики, которая, как программист, является совершенно новой для меня.Откровенно говоря, это сводит меня с ума.Мой пример должен теоретически заставить круг появиться при нажатии кнопки.

Используя методы печати для отладки, я продолжаю находить, что кнопка правильно вызвала все методы и создает новый объект круга 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);
}

}

1 Ответ

2 голосов
/ 17 сентября 2011

Вы используете два разных экземпляра NewNode

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

В своем слушателе действий вы вызываете newNode.drawCircle() для newNode, который не был добавлен в панель содержимого.

Кстати, вы заметили, что у вас есть два Circle класса, где первый делает некоторые странные вещи (например, добавляет новый круг в _circles, к которым у него нет доступа)?

...