# Mal- und Zeichenprogramm



## yax (24. Jun 2010)

Hallo,

ich habe mal eine Frage, und zwar möchte ich ein Malprogramm ( so ähnlich wie Paint) schreiben, aber ich habe keinen Plan wie ich das machen soll. 

Gruß Yax.


PS : Ich hoffe um schnelle Hilfe


----------



## Der Müde Joe (24. Jun 2010)

des
Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials)
und des
Trail: 2D Graphics (The Java™ Tutorials)
sollten für den Anfang reichen


----------



## yax (24. Jun 2010)

Danke für die schnelle Antwort, doch mit diesen Tuturials komme ich nicht weiter, denn ich verstehe die hälfte davon nicht -__-

Vielleicht noch einen anderen Vorschlag um mir zu helfen?


----------



## noobadix (24. Jun 2010)

Hallo,

bitte schreib eeeetwas detaillierter, wo du Probleme hast. Stehe dann gern zur Verfügung!

Gruß N.


----------



## L-ectron-X (24. Jun 2010)

Dann vielleicht hier im Bücher und Tutorials-Bereich: http://www.java-forum.org/buecher-tutorials-links/14545-tutorials-mitgliedern.html
Das Einsteiger-Tutorial von Beni und Roar, da wird in lockerem Stil gezeigt, wie man ein Vectorgrafikprogramm aufbauen kann.


----------



## yax (24. Jun 2010)

heey noobadix,

ich weiß gar nicht wie ich das gesamte programm schreiben soll. Das ist mein Problem


----------



## L-ectron-X (24. Jun 2010)

Dann versuch's einfach mal mit dem Tutorial, danach weißt du's.


----------



## yax (24. Jun 2010)

okay ich werds versuchen


----------



## yax (24. Jun 2010)

Aber eine Andere möglichkeit gibt es nicht, oder?


----------



## Michael... (24. Jun 2010)

yax hat gesagt.:


> Aber eine Andere möglichkeit gibt es nicht, oder?


Hängt davon ab wieviel Euro Dir das Wert ist ;-)
Ansonsten: Nein.


----------



## yax (24. Jun 2010)

Was soll das denn jetzt heißen ???


----------



## cz3kit (24. Jun 2010)

Nun, was MIchael damit meint, stell es einfach in die Jobbörse  Dann macht es sich von selber xDD


----------



## slawaweis (24. Jun 2010)

yax hat gesagt.:


> Danke für die schnelle Antwort, doch mit diesen Tuturials komme ich nicht weiter, denn ich verstehe die hälfte davon nicht -__-
> 
> Vielleicht noch einen anderen Vorschlag um mir zu helfen?


Gegenfrage: wozu brauchst Du ein eigenes Malprogramm bzw. wieso möchtest Du eins schreiben? Und wie sind deine jetzigen Kenntnisse in Sachen Programmierung überhaupt?

Grafikprogramme sind nun mal keine Seltenheit. Es gibt diese in allen Variationen und Funktionsumfängen, ganz teuer und ganz kostenlos. Wieso nicht ein bereits bestehendes, wo Jahre an professioneller Arbeit stecken, verwenden?

Slawa


----------



## yax (25. Jun 2010)

Also ich mache Java jetzt ungefähr ein dreiviertel Jahr und ich habe schon einen Taschenrechner, eine Art Notizbuch, ein Tabellenprogramm und einen Kalender geschrieben.

Ich möchte gerne ein eigenes Malprogramm schreiben damit ich mehr erfarungen sammel kann. 

gruß Yax.


----------



## yax (25. Jun 2010)

Hallo?? 


Ich benötige die Hilfe dringend.

Kann mir denn keiner helfen????


----------



## Sonecc (25. Jun 2010)

1. Nicht jeder hier ist den ganzen Tag in diesem Forum, innerhalb von 2 Stunden nachzufragen ist daher etwas übereilt.
2. Hat man dich schon mehrfach gefragt, wo genau dein Problem liegt. Die Tutorials die genannt wurden sollten ausreichen um grundlegende Fragen zu klären, desweiteren kennst du dich ja schon mit der Programmentwicklung aus, wenn du schon die oben erwähnten Projekte realisiert hast. Dem Leser erschließt sich daher dein Problem schlicht nicht, wenn du ihm keine Informationen gibst.
3. Wenn du nicht wissen solltest, womit du anfangen sollst, bau dir die Gui für den Anfang oder überleg dir erstmal, was genau das Programm alles können soll.


----------



## Tomate_Salat (25. Jun 2010)

Du hast zig tutorials bekommen, wenn dir davon kenntnisse fehlen, dann frag hier nach oder befrage google. Ich (und wahrscheinl. alle anderen hier) haben keine Ahnung wie wir dir noch helfen sollten. 

Also ohne konkrete Fragen => keine Hilfe


----------



## ARadauer (25. Jun 2010)

Wie können wir dir den helfen? Sollen wir es für dich schreiben? Das wird ned billig.

Wenn du es selber machen möchtest, dann stell sinnvolle Fragen aber hör auf hier rum zu spamen!


----------



## yax (25. Jun 2010)

Also ich weiß einfach nicht wie ich das mit dem malen realisiere. also wie mache ich das, wenn der anwender auf das panel oder so geht und malen will. Ich weiß wie ich das aussehen und so mache, aber die funktion malen und farbe änder kann ich nicht.

Tut mir leid, aber i.wie komme ich mit dem Tuturials nicht weiter. Entweder sind die auf englisch oder ich verzweifle an den erklärungen.

Ich hoffe ihr wisst jetzt was mir fehlt.


----------



## Tomate_Salat (25. Jun 2010)

Ja, die Grundlagen! Englisch solltest du können und es sollte dich nicht stören. Übersetz es mit Google'übersetzer und du wirst merken: englisch ist garnicht mal so schlecht zu lesen, wie du anfangs glabust ;-). 

Und ich wiederhole nochmal:

*Wenn du etwas bei den Tutorials technisch (nicht weils Englisch ist!) verstehst, dann frage entweder die API, Google oder stelle den Codeausschnitt/Erklärungversuch hier rein und wir helfen dir*

Aber die Grundlagen wird dir hier sicher keiner beibringen, dafür gibt es Tutorials und Internetvideos (youtube mal für "vom Noob zum SCJP", hdi08 hat dazu bestimmt auch ein super-video-tutorial erstellt)


----------



## yax (25. Jun 2010)

Also ich werde mir jetzt die ganzen passenden "vom Noob zum SCJP" angucken 

Die sind wirklich gut.


----------



## noobadix (25. Jun 2010)

Würde dir denn ein JPanel mit einem MouseListener reichen? Du könntest dessen Undurchsichtigkeit mit .setOpaque(false) ausschalten und darunter nen Canvas in gleicher Größe legen. Dann machste noch ne Buttonleiste, für die unterschiedlichen Funtkionen, die im Code je durch eine "globale" Variable repräsentiert werden, bspw. einen String, der bspw. den Wert "MALEN" annimmt. Im MouseListener wird dann mit if-Zweigen je nach Wert dem Canvas "gesagt" was passieren soll.


```
PANEL.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}

			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}

			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}

			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}

			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub
			}

		});
```


----------



## agentone (25. Jun 2010)

Ich kann grad auch nicht verstehen, was daran so schwer sein soll, eine GUI zu basteln, ein paar Mausereignisse abzufangen und dann etwas auf einem Panel zu zeichnen. Vielleicht solltest du zuerst zu jeder dieser 3 Dinge ein paar kleine Testprogramme schreiben, die du dann später zusammenfügen kannst. Bei kleinen Programmen mit genau definierten Aufgaben ist es nämlich deutlich leichter dir zu helfen, als bei "Hallo, ich will Paint klonen, hab aber keine Ahnung.".

Zum Thema Englisch: Niemand erwartet von dir, dass du jedes englische Wort verstehst. Allerdings kommt man als Informatiker nicht umhin, Englisch gut bis sehr gut zu können, vorallem weil eben vieles nicht ins Deutsche übersetzt wird. (Eclipse, JavaDoc, How to..., diverse Tutorials und und und)


----------



## slawaweis (25. Jun 2010)

yax hat gesagt.:


> Also ich mache Java jetzt ungefähr ein dreiviertel Jahr und ich habe schon einen Taschenrechner, eine Art Notizbuch, ein Tabellenprogramm und einen Kalender geschrieben.
> 
> Ich möchte gerne ein eigenes Malprogramm schreiben damit ich mehr erfarungen sammel kann.


d.h. Du willst lernen und das bedeutet auch, Du musst dich ransetzen und versuchen auch komplizierte Sachen zu verstehen. Gleich am Anfang versteht man nicht alles, aber das bedeutet nicht, dass man es sofort hinschmeißt. Man muss lesen und versuchen das zu verstehen, was geht. Danach üben und/oder experimentieren. Dann wieder von Vorne lesen. Nach 3-5 Mal wird es klarer und man versteht viel mehr. Wenn Englisch ein Problem ist, es gibt auch genug Tutorials auf Deutsch, hier z.B.:

Inhaltsverzeichnis
Zeichnen mit Java2D
Java: Graphik & Zugriff auf Fensterflächen
JAVA: 12.4 Java 2D

oder allgemein mit den Stichworten "Java2D" und "lernen" über Google suchen.

Hier noch ein Tipp für den Anfang. Zeichen sollte man nicht direkt auf den Bildschirm oder einem Panel, sondern zuerst in einen Grafikbuffer, die Klasse dafür ist "BufferedImage". Dieses Buffer kopiert man dann einfach jedes mal auf den Bildschirm bzw. aufs Panel, wenn sich die Fensteransicht verändert hat. Viel Erfolg.

Slawa


----------



## yax (25. Jun 2010)

Also als erstes muss ich mal sagen das die Tuturials von slawaweis super sind. Denn ise helfen mir viel weiter. Ich bin grad noch mit den Videos am lernen, und ich verstehe schon viel mehr vom Zeichnen. Ich denke so langsam komme ich dahinter 

(Mal so ne Frage die hier garnicht reingehört, ab wie vielen jahren darf man hier angemeldet sein?? nur aus reiner Interesse???)


----------



## Java-Freak (25. Jun 2010)

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17 Grafikprogrammierung
ich kann mir denken. das du vll nen MouseMotionListener brauchst, der bei verschiebung der maus auf nem panel lauter punkte zeichnet oder so...


----------



## agentone (25. Jun 2010)

> (Mal so ne Frage die hier garnicht reingehört, ab wie vielen jahren darf man hier angemeldet sein?? nur aus reiner Interesse???)



Da dieses Forum gewaltverherrlichend ist und der Server hier eigentlich nur zum Porno-Austausch geschaffen wurde und als Decknamen "Java-Forum" bekam, damit das alles nicht auffliegt, würde ich sagen,







:lol:


----------



## yax (25. Jun 2010)

Aha ist ja cool


----------



## agentone (25. Jun 2010)

> Aha ist ja cool



Und warum fragst du dann?


----------



## L-ectron-X (25. Jun 2010)

noobadix hat gesagt.:


> Würde dir denn ein JPanel mit einem MouseListener reichen? Du könntest dessen Undurchsichtigkeit mit .setOpaque(false) ausschalten und darunter nen Canvas in gleicher Größe legen.


Oh nein! Was rätst du ihm hier nur für einen Unsinn!? JPanel und Canvas... Sowas macht man einfach nicht.


----------



## Tomate_Salat (25. Jun 2010)

Hier mal ein etwas älteres Codestück von mir aber du kannst dir ja mal das Prinzip anschauen:


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


/**
* Einfaches Polygone Spiel: klicken Sie mit der Linken Maus auf
* die weiße fläche. Es fängt an sich nach und nach ein Polygone
* aufzubauen. Drücken Sie STRG+Linke Maustaste, so wird ein neues
* Polygone angefangen (aber die alten werden beibehalten).
*
* @author Tomate_Salat
*/
public class PolygonExampel    
{
    private JFrame                frame;
    private Polygon                currentPolygone;
    private List<Polygon>        polygone;
    private JComponent            painter;
    
    public PolygonExampel()
    {
        frame        = new JFrame("Polygone Excampel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        polygone    = new ArrayList<Polygon>();        
        
        init();
    }        
    
    private void init()
    {
        getNewPolygone();
        
        painter        = new JComponent()
        {                        
            private static final long serialVersionUID = 1L;

            @Override
            protected void paintComponent(Graphics g)
            {
                // Hier würde normalerweise erst super.paintComponent aufgerufen
                // werden, damit System seine Arbeit machen kann, in unserem
                // Falle ist dies aber eher störend
                // super.paintComponent(g);
            
                Graphics2D g2d    = (Graphics2D) g.create(); // Niemals g direkt verwenden!!!
                
                // Hintergrund weis zeichnen
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                
                // Polygone zeichnen
                for(Polygon poly : polygone)
                {                    
                    g2d.setColor(new Color(0,0,0,100));
                    g2d.fillPolygon(poly);
                    g2d.setColor(Color.BLUE);
                    g2d.drawPolygon(poly);                    
                }
                
                g2d.dispose();                               // Ressourcen wieder freigeben!!!
            }
        };
        painter.setOpaque(true);
        painter.setPreferredSize(new Dimension(300, 300));
        painter.setSize( painter.getPreferredSize() );
        painter.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseReleased(MouseEvent e)
            {
                Point p    = e.getPoint();
                
                if(!e.isPopupTrigger() && !e.isControlDown())
                {
                    currentPolygone.addPoint(p.x, p.y);
                    painter.repaint();
                }
                else if(!e.isPopupTrigger() && e.isControlDown())
                {
                    getNewPolygone();
                    currentPolygone.addPoint(p.x, p.y);
                }                
            }
        });
        
        frame.add(painter);
    }
    
    private void getNewPolygone()
    {
        currentPolygone    = new Polygon();
        polygone.add( currentPolygone );
    }    
    
    public void open()
    {
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new PolygonExampel().open();
            }
        });
    }
}
```


----------



## yax (26. Jun 2010)

So, ich weiß jetzt endlich wie man zeichnet, aber wie ermögliche ich das sich ein fenster öffnet, man drückt auf einen Button und man kann zum Beispiel ein Rechteck auf die Zeichenfkäche zeichnen??


----------



## Gelöschtes Mitglied 5909 (26. Jun 2010)

du fragst ob der button rechteck selectiert ist, wenn ja dann malst du ein rechteck
wenn der button kreis selectiert ist dann malst du einen kreis


----------



## yax (26. Jun 2010)

eine kleine Frage :

Wie selectiere ich einen Button zum Beispiel mit einen Rechteck??


----------



## hdi (26. Jun 2010)

Für dein Menü solltest du JToggleButton's benutzen. die Methode isSelected() gibt zurück ob der Button aktiviert ist, mit setSelected(boolean) kannst du ihn programmatisch (de-)selektieren.


```
if(rechteckButton.isSelected()){
     g.drawRect(...)
}
else if(kreisButton.isSelected()){
     g.drawOval(....)
}
```


----------



## yax (26. Jun 2010)

Ich entschuldige mich dass ich so viel Hilfe benötige, aber ich hab mit Java noch nie gemalt.

Wie heißt denn mein Untergrund, also da wo ich drauf malen kann??


----------



## Java-Freak (26. Jun 2010)

JPanel...
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17 Grafikprogrammierung
lies dir das kapitel am besten mal von ganz von vorne durch


----------



## yax (26. Jun 2010)

Aber wie kann ich denn dann mit dem Mauszeiger auf das panel malen?? (natürlich im geöffneten Programm)


----------



## hdi (27. Jun 2010)

Das geht nicht ohne weiteres, genau das musst du ja programmieren 

Du brauchst zunächst einen MouseListener und MouseMotionListener, die du per addMouse(Motion)Listener() auf dein JPanel addest.
Die Methoden wie mousePressed, mouseReleased und mouseDragged werden automatisch
aufgerufen wenn diese Events eintreten - und in den Methoden musst du darauf reagieren
und halt etwas auf das Panel zeichnen.

Btw: Kuck mal in meine Signatur, ich hab auf Youtube einen Video-Kurs gemacht (im Moment 52 Teile glaub ich), man merkt dass dir Grundkenntnisse fehlen. Zieh dir den Kurs komplett rein dann verstehste schon weit mehr! (Ab Teil 40 geht's los mit GUI's aber ich empfehle dir *dringend *bei Teil 1 zu beginnen).


----------



## Java-Freak (27. Jun 2010)

ich würde es so angehen: 
ich würde eine klasse xy von jpanel ableiten und die paintComponent überschreiben...dann würde ich einen konstuktor xy erstellen, der einen frame erzeugt und sich selber zu dem frame hinzufügt...des weiteren sollte xy noch MouseMotionListener und Runnable implementieren(nicht das addXX im konstruktor vergessen) dann einen neuen thread von sich selber machen uns starten...in deiner run() steht dann eine endlosschleife, die repaint aufruft und dann 10milisec wartet.sobald jetzt deine maus bewegt wird setzt du einen boolean auf true, der dann in der repaint abgefragt wird, wieder auf false gesetzt wird und die repaint zeichnet einen punkt an die mauskoordinaten...
Ich kanns ja morgen vllt mal implementieren wenn mir lw ist...


----------



## yax (27. Jun 2010)

sind das die Videos "Vom Noob zum SCJP" oder wie das heißt??


----------



## yax (27. Jun 2010)

Jawa-Freak, das wäre super cooooool


----------



## hdi (27. Jun 2010)

@yax
Ja genau so heisst der Kurs

@Java-Freak
Sorry, aber was du da vorschlägst hört sich nicht gut an! Sowas nennt man "busy waiting" und ist total unperformant. Du brauchst so eine ständige Überprüfung doch gar nicht, eben weil wir mit Swing/AWT den EDT mit den Events haben. Wenn der User irgendwas mit der Maus tut, dann registiert das ja ein entsprechender Listener, und direkt _in_ der Listener-Methode machst du entsprechende Änderungen an deinen Daten und rufst dann ein repaint() auf.
Solange sich im Programm nix tut müssen wir auch nix machen. Ein Thread der da ständig läuft ist unangemessen dafür!


----------



## yax (27. Jun 2010)

Okay dann werde ich jetzt mal anfangen zu gucken, ich habe schon die Teile 47 bis 49 geguckt und die waren sowas von suuuuper gut, echt spitze


----------



## Java-Freak (27. Jun 2010)

hdi hat gesagt.:


> Sorry, aber was du da vorschlägst hört sich nicht gut an! Sowas nennt man "busy waiting" und ist total unperformant. Du brauchst so eine ständige Überprüfung doch gar nicht, eben weil wir mit Swing/AWT den EDT mit den Events haben. Wenn der User irgendwas mit der Maus tut, dann registiert das ja ein entsprechender Listener, und direkt _in_ der Listener-Methode machst du entsprechende Änderungen an deinen Daten und rufst dann ein repaint() auf.
> Solange sich im Programm nix tut müssen wir auch nix machen. Ein Thread der da ständig läuft ist unangemessen dafür!


ja, stimmt man sollte auch nur im Listener nachdem man den punkt gezeichnet hat repainten...


----------



## yax (27. Jun 2010)

Hdi, dein Tuturial ist echt suuuper.

Aber da ich nie so lange an den PC kann, kann ich nicht so viel gucken und aufnehem. 

Aber suuuper 

PS: Wollte ich nur mal so sagen


----------

