N
Moin moin
Nobuo T schrieb:
==> Wenn du auf die zusaetzlichen Variablen/Methoden von MyCanvas zugreifen willst, musst du als Typ auch MyCanvas angeben (fuer die Variable c in deinem Programm).
Asche auf mein Haupt, das hab ich total verpatzt
Inzwischen hab ich's berichtigt und bin nun auch gut vorangekommen. Inzwischen kann ich so zeichnen, wie ich mir das vorgestellt hatte, Pinselform und -farbe sind auch veränderbar. Allerdings habe ich noch 2-3 kleine Problemchen und würde euch bitten, mal reinzuschauen und mir zu sagen, was ich da verbessern könnte.
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.Choice;
import java.awt.Canvas;
import java.awt.Point;
public class Zeichenprogramm extends Applet implements ItemListener, MouseListener,
MouseMotionListener{
MyCanvas c;
Choice colorChoice;
Choice brushChoice;
boolean start = true;
// Punkte zur Speicherung der Mauspositionen
private Point p_new = new Point();
private Point p_old = new Point();
public void init(){
setLayout(new BorderLayout());
/* --- Farbwahl für die rechte Seite --- */
// Panel als Container
Panel p1 = new Panel();
p1.setLayout(new GridLayout(2,1));
// Label
Label l1 = new Label("Pinselfarbe", Label.CENTER);
p1.add(l1);
// Erstellen der Komponente für die Farbwahl
colorChoice = new Choice();
colorChoice.addItem("rot");
colorChoice.addItem("grün");
colorChoice.addItem("blau");
colorChoice.addItem("gelb");
colorChoice.addItem("schwarz");
colorChoice.addItemListener(this);
p1.add(colorChoice);
// Einfügen des Panels in das Applet
add("East", p1);
/* --- Pinselform für die rechte Seite --- */
// Panel als Container
Panel p2 = new Panel();
p2.setLayout(new GridLayout(2,1));
// Label
Label l2 = new Label("Pinselform", Label.CENTER);
p2.add(l2);
// Erstellen der Komponente für die Farbwahl
brushChoice = new Choice();
brushChoice.addItem("1");
brushChoice.addItem("2");
brushChoice.addItem("3");
brushChoice.addItem("4");
brushChoice.addItem("5");
brushChoice.addItemListener(this);
p2.add(brushChoice);
// Einfügen des Panels in das Applet
add("West", p2);
c = new MyCanvas();
c.addMouseListener(this);
c.addMouseMotionListener(this);
add("Center", c);
}
class MyCanvas extends Canvas{
public MyCanvas(){
setBackground(Color.white);
}
int color_index;
int brush_index;
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
BasicStroke mypen = new BasicStroke( brush_index );
g2.setStroke(mypen);
switch (c.color_index){
case 0: g2.setColor(Color.red); break;
case 1: g2.setColor(Color.green); break;
case 2: g2.setColor(Color.blue); break;
case 3: g2.setColor(Color.yellow); break;
case 4: g2.setColor(Color.black); break;
}
g2.fillRect(p_new.x,p_new.y,0,0);
g2.drawLine(p_old.x, p_old.y, p_new.x, p_new.y);
}
public void update(Graphics g) {
paint(g);
}
}
// Funktionen für den ItemListener
public void itemStateChanged(ItemEvent e){
c.color_index = colorChoice.getSelectedIndex();
c.brush_index = brushChoice.getSelectedIndex()+1;
}
// Funktionen für den MouseListener
public void mouseClicked(MouseEvent e){
p_new.x = e.getX();
p_new.y = e.getY();
p_old.x = p_new.x;
p_old.y = p_new.y;
c.repaint();
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
start = true;
}
public void mouseDragged(MouseEvent e)
{
p_old.x = p_new.x;
p_old.y = p_new.y;
p_new.x = e.getX();
p_new.y = e.getY();
if ( start )
{
p_old.x = p_new.x;
p_old.y = p_new.y;
start = false;
}
c.repaint();
}
public void mouseMoved(MouseEvent e){
}
}
1. Wenn man das applet laufen lässt, sieht man, dass die Labels links und rechts jeweils sehr viel Abstand zu den Choice Boxen haben. Wie könnte ich das ändern?
2. Ich hätte gern einen Rahmen um das Canvas gezogen, damit das Zeichenfeld eindeutig begrenzt ist. Gibt es da eine Möglichkeit?
3. Wenn ich das Fenster vergrößere bzw. verdecke (also im Prinzip wohl das komplette Applet neu zeichne), wird die Zeichnung wieder gelöscht. Wie kann ich das verhindern?
Vielen Dank für Eure Hilfe
Gruß
Neron17