B
Bernd1983
Gast
Ich habe jetzt ein FigurenProgramm fertig programmiert
Mein Probleme: 1. wenn ich im main die Factory festlege ( wie bei mir zb Circlefactory) zeichnet er bei jeder Auswahl der Figur einen Kreis. Wie kann das variabel machen, dh im Menü wird entschieden was gezeichnet wird nicht in der main.
2. Wie zeichne ich Dreiecke? also bezogen auf meinen Fall mit mausziehen?
Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseEvent;
abstract class Figure{
int x;
public Figure(){
}
public Figure(int x){
this.x=x;
}
abstract public void paintMe(Graphics g);
}//end Figure
class Quad extends Figure{
int y,w,h;
Quad(){}
Quad(int x,int y, int w, int h){
super(x);
this.y=y;
this.w=w;
this.h=h;
}
public void paintMe(Graphics g){
g.setColor(Color.yellow);
g.fillRect(x, y, w, h);
}
}
class Triangle extends Figure{
int y;
int x1;
int y1;
Triangle(int x, int y,int x1, int y1){
super(x);
this.y=y;
this.x1=x1;
this.y1=y1;
}
public void paintMe(Graphics g){
g.setColor(Color.green);
g.drawLine(x, y, x1, y1);
}
}//end Triangle
class Circle extends Figure{
int y,width,height;
Circle(int x,int y, int w, int h){
super(x);
this.y=y;
this.width=w;
this.height=h;
}
public void paintMe(Graphics g){
g.setColor(Color.blue);
g.fillOval(x, y, width, height);
}
}//end Circle
class FigurePanel extends JPanel{
Figure figur=null;
public void paintComponent(Graphics g){
super.paintComponent(g);
if(figur!=null){//fängt NullPointerException
figur.paintMe(g);
}
}
}
class SwingDemo extends JFrame implements ActionListener{
int x,y,width,height;
int x1,y1;
char k=' ';
Graphics z;
FigurePanel figurePanel=null;
JButton green;
JButton test;
JMenuBar jmenubar;
JMenu menu;
//JMenuItem item1;
JRadioButtonMenuItem jradiomenu;
FigureFactory figfact;
SwingDemo(FigureFactory figfact){
this.figfact=figfact;
getContentPane().setLayout(new BorderLayout());
figurePanel=new FigurePanel();
getContentPane().add(figurePanel,BorderLayout.CENTER);
jmenubar=new JMenuBar();
getContentPane().add(jmenubar,BorderLayout.WEST);
jradiomenu=new JRadioButtonMenuItem("Viereck");
JRadioButtonMenuItem jradiomenu2=new JRadioButtonMenuItem("Dreieck");
JRadioButtonMenuItem jradiomenu3=new JRadioButtonMenuItem("Kreis");
jmenubar.add(jradiomenu);
jmenubar.add(jradiomenu2);
jmenubar.add(jradiomenu3);
//menu.add(jradiomenu3);
menu=new JMenu();
jmenubar.add(menu);
menu.add(jradiomenu);
menu.add(jradiomenu2);
menu.add(jradiomenu3);
jradiomenu.setActionCommand("Viereck");
jradiomenu2.setActionCommand("Dreieck");
jradiomenu3.setActionCommand("Kreis");
getContentPane().addMouseListener(new MyMouseListener());
getContentPane().addMouseMotionListener(new MyMouseMotionListner());
jradiomenu.addActionListener(this);
jradiomenu3.addActionListener(this);
}
class MyMouseListener implements MouseListener
{
public void mouseClicked(MouseEvent me) {};
public void mousePressed(MouseEvent me) {
//Startpunkt bestimmen
Point po=me.getPoint();
x=po.x;
y=po.y;
}
public void mouseReleased(MouseEvent me){
Figure fig=choose();
figurePanel.figur=fig;
figurePanel.repaint();
}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}//end MyMouseListener
class MyMouseMotionListner implements MouseMotionListener{
public void mouseMoved( MouseEvent e ) { }
public void mouseDragged( MouseEvent e ) {
if(k=='V'){
if (e.getX() > x && e.getY() > y) {
width=e.getX()-x;
height=e.getY()-y;
}
}
if(k=='D'){
if (e.getX() > x && e.getY() > y) {
x1=e.getX()-x;
y1=e.getY()-y;
}
}
if(k=='K'){
if (e.getX() > x && e.getY() > y) {
/*width=e.getX()-x;
height=e.getY()-y;*/
width=100;
height=120;
}
}
repaint();
}
}//MyMouseMotionListener
Figure choose(){//Hilfsmethode zur Auswahl der Figur
Figure fig=null;
if(k=='V'){
fig=figfact.create(x,y,width,height);
figurePanel.setBackground(Color.black);
}
if(k=='D'){
fig=figfact.create(x,y,x1,y1);
figurePanel.setBackground(Color.red);
}
if(k=='K'){
fig=figfact.create(x,y,width,height);
figurePanel.setBackground(Color.green);
}
return fig;
}//end
public void actionPerformed(ActionEvent a){
//wen eine Action zutrifft bekommt die Variable k ein char zugewiesen
if(a.getActionCommand().equals("Viereck")){
k='V';
}else if(a.getActionCommand().equals("Dreieck")){
k='D';
}else if(a.getActionCommand().equals("Kreis")){
k='K';
}
}//end
}//end
//Fabrik
abstract class FigureFactory{
abstract Figure create(int x,int y,int w,int h);
}
class QuadFactory extends FigureFactory{
public Figure create(int x,int y,int w,int h){
return new Quad(x,y,w,h);
}
}//end
class TriangleFactory extends FigureFactory{
public Figure create(int x,int y,int w,int h){
return new Quad(x,y,w,h);
}
}//end
class Circle extends FigureFactory{
public Figure create(int x,int y,int w,int h){
return new Circle(x,y,w,h);
}
}//end
public class DesignPattern {
public static void main(String [] args){
FigureFactory ff=new CircleFactory();
SwingDemo a=new SwingDemo(ff);
a.setSize(300, 300);
a.setVisible( true );
}
}
Mein Probleme: 1. wenn ich im main die Factory festlege ( wie bei mir zb Circlefactory) zeichnet er bei jeder Auswahl der Figur einen Kreis. Wie kann das variabel machen, dh im Menü wird entschieden was gezeichnet wird nicht in der main.
2. Wie zeichne ich Dreiecke? also bezogen auf meinen Fall mit mausziehen?