Java-Zeichenfeld mit AWT

Diskutiere Java-Zeichenfeld mit AWT im AWT, Swing, JavaFX & SWT Bereich.
V

VictoriaSchmidt

Hallo,
ich habe einen Code geschrieben, mit dem Ziel, ein Zeichenfeld in java AWT zu realisieren, mithilfe von Frames. (Swing oder JFrames usw. habe ich noch nicht gelernt, und zu AWT ergibt eine Internetsuche vergleichsweise wenig, jedenfalls nichts, was mir weiterhilft). Man soll in einem Choice-Feld die Farben, mit denen man malen möchte, auswählen können. Leider malt es nicht und ich weiß nicht, warum. Es zeigt nur ein schwarzes Fenster an mit dem Choice-Feld. Fehler gibt es keine aus. Es wäre sehr hilfreich, wenn jemand mich auf meine Fehler hinweisen könnte.
Dankeschön

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;


public class PaintCanvas extends Canvas {
    //Initialisierung
    private Color aktuelleFarbe = Color.WHITE;
    private Point mousePositionStart;
    private Point mousePosition;
    private ArrayList<Line> lines = new ArrayList<Line>();
    private Line currentLine;
    

    
    
    public PaintCanvas() {
        init();
        frameInit();
    }
    
    //initialisiert die MouseListener
    private void init() {
        this.setPreferredSize(new Dimension(300, 400));
        this.setMinimumSize(new Dimension(300, 400));
        
        //MouseListener erstellen
        this.addMouseListener(new MouseAdapter() {
            //Mausdrücken erstellt neue Linie
            @Override
            public void mousePressed(MouseEvent e) {
                mousePositionStart = e.getPoint();
                currentLine = new Line(aktuelleFarbe);
            }
            
            //Mausloslassen fügt Linie in Linienliste ein
            @Override
            public void mouseReleased(MouseEvent e) {
                if(!currentLine.isEmpty()) {
                    lines.add(currentLine);
                }
                currentLine=null;
                repaint();
            }
            
        });
        
        
        //MouseMotionListener erstellen, fügt Punkte in Linie ein
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mousePosition = e.getPoint();
                currentLine.add(mousePosition);
                repaint();
                mousePositionStart = mousePosition;
                
            }
            
        });
    }
    
    //Initialisiert das Fenster
    private void frameInit() {
        //Fenster-Frame erstellen und Rahmenbedingungen festlegen
        Frame f = new Frame("PaintCanvas");
        f.setBackground(Color.BLACK);
        f.setSize(300,400);
        f.setLayout(new BorderLayout());
        f.setLocationRelativeTo(null);
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.add(this, BorderLayout.CENTER);
        
        
        //Choice Button initialisieren und aktuelle Farbe zuordnen, zum Fenster zufügen
        Choice colorChooser = new Choice();
        colorChooser.add("white");
        colorChooser.add("blue");
        colorChooser.add("red");
        colorChooser.add("green");
        colorChooser.add("yellow");
        colorChooser.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                String s = colorChooser.getSelectedItem();
                switch(s) {
                case "white": 
                    aktuelleFarbe = Color.WHITE;
                    break;
                case "blue":
                    aktuelleFarbe = Color.BLUE;
                    break;
                case "red":
                    aktuelleFarbe = Color.RED;
                    break;
                case "green":
                    aktuelleFarbe = Color.GREEN;
                    break;
                case "yellow":
                    aktuelleFarbe = Color.YELLOW;
                    break;
                }
            }        
        });
        f.add(colorChooser, BorderLayout.SOUTH);
        
        //Fenster sichtbar machen
        f.setVisible(true);
    }
    
    
    
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
    
        //Alle gemalten Linien nochmals zeichnen
        if(!lines.isEmpty()) {
            for(Line l: lines) {
                if(l.size()>1) {
                    for(int i=1; i<l.size()-1; i++) {
                        g.setColor(l.getColor());
                        g.drawLine(l.get(i-1).x, l.get(i-1).y, l.get(i).x, l.get(i).y);
                    }
                }
                    
                //Falls nur ein Punkt in Linie ist, handelt es sich um einen Punkt
                //daher: Ovaler Punkt zeichhen
                if(l.size()==1){
                    g.fillOval(l.get(0).x-3, l.get(0).y-3, 6, 6);
                }
            }
        }
    }
}


import java.awt.Point;
import java.util.ArrayList;
import java.awt.Color;

//Speichert Linien als Menge von Punkten
public class Line {
    private ArrayList<Point> points;
    private Color color;
    
    public Line(Color color) {
        points = new ArrayList<Point>();
        color = this.color;
    }
    
    //fügt Punkt zur Linie hinzu
    public void add(Point point) {
        points.add(point);
    }
    
    //true, falls keinen Punkt enthält
    public boolean isEmpty() {
        return points.isEmpty();
    }
    
    //gibt zurück, aus wievielen Punkten die Linie besteht
    public int size() {
        return points.size();
    }
    
    //gibt Punkt an gegebenem Index zurück
    public Point get(int index) {
        return points.get(index);
    }
    
    //liefert Farbe der Linie zurück
    public Color getColor() {
        return color;
    }


}


import java.awt.Frame;

public class PaintCanvasTest {

    public static void main(String[] args) {
        PaintCanvas a = new PaintCanvas();

    }

}
 
V

VictoriaSchmidt

Vielen Dank, hab den Fehler gefunden. Blöder Leichtsinnsfehler... es muss this.color = color heißen, nicht umgekehrt.
 
mihe7

mihe7

So etwas lässt sich verhindern, wenn man die Parameter final deklariert.
 
Thema: 

Java-Zeichenfeld mit AWT

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben