Swing mit Fabriken

Status
Nicht offen für weitere Antworten.
B

Bernd1983

Gast
Ich habe jetzt ein FigurenProgramm fertig programmiert

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?
 

Marco13

Top Contributor
Zu 1. Da wäre es naheliegend dass die Factories die Variable 'k' ersetzen. Also statt
Code:
class SwingDemo extends JFrame implements ActionListener{
   
    char k=' '; 
    
    ....

    if(a.getActionCommand().equals("Viereck")){    
                 k='V';
    }
    ....


    Figure choose(){//Hilfsmethode zur Auswahl der Figur
        Figure fig=null; 
        if(k=='V'){
           fig=figfact.create(x,y,width,height); 
        }
        if(k=='D'){
           fig=figfact.create(x,y,x1,y1);
       } 
    }

}
würdest du dann entsprechend schreiben
Code:
class SwingDemo extends JFrame implements ActionListener{
   
    private FigureFactory currentFigureFactory;
    
    ....

    if(a.getActionCommand().equals("Viereck")){    
        currentFigureFactory = new QuadFactory();
    }
    ....


    Figure choose(){//Hilfsmethode zur Auswahl der Figur
        Figure fig= currentFigureFactory.create(...);
       ...
    }

}


Zu 2.:
Da gibt es verschiedene Möglichkeiten. Da man (prinzipbedingt) ein DREIeck nicht mit ZWEI Punkten festlegen kann, könntest du einfach das gleiche machen, wie bei einem Rechteck, aber das Rechteck entlang der Diagonalen abschneiden. (Das ist keine zufriedenstellende Lösung, aber wie so eine Lösung aussehen würde, kannst du dir ja überlegen)
 

Marco13

Top Contributor
P.S: Die Abfrage des Typs innerhalb von "mouseDragged" ist nicht schön. Damit machst du dir die Allgemeingültigkeit und Flexibilität, die durch die abstrakten Klassen und Factories erreicht werden sollte, gerade wieder kaputt. Überleg' mal, ob man das, was dort gemacht wird, nicht für JEDE "Figur" (irgendwie) "gleich" machen könnte....
 
B

Bernd1983

Gast
@marco13: hi hab jetzt erst deine posts gesehn

1. also hab die Hilfsmethode nun so gemacht:

Code:
 Figure choose(){//Hilfsmethode zur Auswahl der Figur
      
       Figure fig=figfact.create(x,y,width,height);
       
       return fig;
       
   }//end

funktioniert nicht.


zu 2. Dreieck

hmm ok das mit der Hälfte ist mir schon klar, nur wie mache ich das mit meiner drawRect() Methode?

und 3. Allgmein halten.

das ist mir auch schon aufgefallen. aber leider weiss ich nicht wie ich das Allgmein halte.


greets
 

Marco13

Top Contributor
1. Funktioniert DOCH (*nä-nä-nä-nä-näää-näää*) :roll:

2. Du hast ja x,y,w und h. Die Punkte des Dreiecks sind dann z.B.
x,y
x+w, y
x+w, y+h
Und zwischen diesen Punkten kanst du mit drawLine Linien zeichnen. Wie schon an anderer Stelle erwähnt: Du könntest auch (für Quad und Triangle) die Klasse "Polygon" verwenden. Die würdest du mit den gewünschten Eckpunkten füllen, und dann g.drawShape(polygon) verwenden.

3. Wenn du jetzt z.B. noch eine Figur "Stern" dazufügen willst, musst du (wenn du dieses 'k' und die Abfragen usw. verwendest) an sehr vielen Stellen im Code änderungen machen. Wenn du die Factory richtig einsetzt, wäre das einfacher: Dann bräuchtest du nur eine SternFactory zu schreiben, und im Hauppteil des Programms dann NUR die EINE Abfrage
Code:
if(a.getActionCommand().equals("Stern")){   
        currentFigureFactory = new StarFactory();
}
hinzuzufügen.
 
B

Bernd1983

Gast
zu 1. keine Ahnung - ich habs so implementiert wie du gesagt hast - funktioniert einfach nicht


zu 2. ok danke. das funktioniert sehr gut

zu 3. ich weiss dass dies viel zu spezialisiert ist, nur weiss ich nicht wie ichs ändern soll damit es Allgemein bleibt
 

KSG9|sebastian

Top Contributor
Du könntest die Figur anhand der Klasse erzeugen.

Code:
FigureFactory fac = FigureFactory.getInstance().create(Quad.class).create(x, y, width, height);

Wobei du den Namen der Klasse eben dynamisch herausfinden musst, sonst geht der ganze Sinn ja wieder verloren :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
G Maven Swing: Wie verwende ich WindowListener ? Java Basics - Anfänger-Themen 2
C Threads und Swing Java Basics - Anfänger-Themen 9
A Swing: Raumshiff Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
nbergmann Wo ist javax.swing.JOptionPane gespeichert? Java Basics - Anfänger-Themen 4
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
O Swing JPanel Java Basics - Anfänger-Themen 4
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
M SpielMenü mit Swing Java Basics - Anfänger-Themen 3
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
N javax swing JOptionPane Hilfe Java Basics - Anfänger-Themen 3
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
M Java swing im Browser starten Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
Z Threads SWING mit EventQueue.invokeLater Java Basics - Anfänger-Themen 1
P JDK installieren javac behauptet Javax.swing existiert nicht Java Basics - Anfänger-Themen 8
K Ascii Converter mit Swing Java Basics - Anfänger-Themen 4
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
N Erste Schritte Karte in SWING Application Java Basics - Anfänger-Themen 4
D Mehrfacherfassung in Swing GUI Java Basics - Anfänger-Themen 12
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
J Input/Output Charset Swing- Eingaben? Java Basics - Anfänger-Themen 8
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
B Swing intstalliert Eclips{}, mackiert Rot Java Basics - Anfänger-Themen 6
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
B Java Swing "Zeichenfläche" Java Basics - Anfänger-Themen 1
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
C Swing frage Java Basics - Anfänger-Themen 8
T Rechenprogramm mit Swing Java Basics - Anfänger-Themen 3
K Swing Darstellungsproblem Java Basics - Anfänger-Themen 11
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
P Swing - Blackscreen Java Basics - Anfänger-Themen 10
Y Random-Objekt und Swing Java Basics - Anfänger-Themen 4
M Klassen Hilfe bei SWING Java Basics - Anfänger-Themen 5
S GUI Problem: Swing Java Basics - Anfänger-Themen 8
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
B Erste Schritte Primefaces -> Swing Gui Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S Programmoberfläche mit Java-Swing - Herangehensweise Java Basics - Anfänger-Themen 20
E Fragen zu paintXXX in Swing Java Basics - Anfänger-Themen 7
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Alternative zum manuellen Swing programmieren?? Java Basics - Anfänger-Themen 4
S Android fuer Swing-Kenner..? Java Basics - Anfänger-Themen 6
J Swing Timer Java Basics - Anfänger-Themen 3
B Seltsamer Fehler in SWING anwendung Java Basics - Anfänger-Themen 2
D GPS Tracker Swing Java Basics - Anfänger-Themen 2
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
B Einstieg in swing GUI Java Basics - Anfänger-Themen 7
S Swing Eingabe Erzwingen Java Basics - Anfänger-Themen 3
S Swing JTable Java Basics - Anfänger-Themen 7
Z Input/Output Programm mit Swing umsetzen Java Basics - Anfänger-Themen 6
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
V Dropdown Button in einer GUI (Java Swing) Java Basics - Anfänger-Themen 12
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
O swing komponenten werden nicht angezeigt Java Basics - Anfänger-Themen 6
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
P Im Fenster bleiben (swing) Java Basics - Anfänger-Themen 16
M Einfacher Swing Wizard Java Basics - Anfänger-Themen 3
E Swing FileWrite?? Java Basics - Anfänger-Themen 3
S Umlaute in Swing-GUI Java Basics - Anfänger-Themen 8
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
M Swing Klasse auch per Kommandozeile starten? Java Basics - Anfänger-Themen 2
S JAVA Swing Eventlistener Java Basics - Anfänger-Themen 11
P Swing - Welche Klasse für ausgeben von Ergebnissen? Java Basics - Anfänger-Themen 3
V Swing Componenten werden auf Mac nicht angezeigt Java Basics - Anfänger-Themen 19
J Überfordert mit Swing Java Basics - Anfänger-Themen 5
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
B Bei Swing weg vom North-West-South-East-Prinzip Java Basics - Anfänger-Themen 2
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
F Werteübergabe in Swing Formularen (gui Builder) Java Basics - Anfänger-Themen 9
L Swing GridBagLayout Java Basics - Anfänger-Themen 3
K Bild als Hintergrund in einem Swing Fenster Java Basics - Anfänger-Themen 21
J unterschied zwischen awt und swing Java Basics - Anfänger-Themen 6
C Swing i.V.m. Threads Java Basics - Anfänger-Themen 2
J XML Viewer for Swing Java Basics - Anfänger-Themen 6
Y Anfänger Hausaufgabe... Swing Java Basics - Anfänger-Themen 6
W Zeichnen in Swing Java Basics - Anfänger-Themen 7
B Swing Applikation mit mehreren Klassen Java Basics - Anfänger-Themen 2
C Swing, Buttons Wert zuweisen Java Basics - Anfänger-Themen 3
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
J Java GUI in Swing und das MVC Paradigma Java Basics - Anfänger-Themen 3
M Swing Java Basics - Anfänger-Themen 7
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben