Mal- und Zeichenprogramm

yax

Bekanntes Mitglied
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 ;)
 

yax

Bekanntes Mitglied
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?
 
G

Gelöschtes Mitglied 20545

Gast
Hallo,

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

Gruß N.
 

slawaweis

Bekanntes Mitglied
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

Bekanntes Mitglied
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.
 

Sonecc

Gesperrter Benutzer
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.
 
T

Tomate_Salat

Gast
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

Top Contributor
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

Bekanntes Mitglied
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.
 
T

Tomate_Salat

Gast
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)
 
G

Gelöschtes Mitglied 20545

Gast
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.

Java:
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
			}

		});
 
Zuletzt bearbeitet von einem Moderator:

agentone

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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 :D

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

agentone

Bekanntes Mitglied
(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,
600px-FSK_ab_18_logo_Dec_2008.svg.png



:lol:
 
T

Tomate_Salat

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

Java:
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

Bekanntes Mitglied
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??
 
G

Gelöschtes Mitglied 5909

Gast
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
 

hdi

Top Contributor
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.

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

yax

Bekanntes Mitglied
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??
 

hdi

Top Contributor
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

Bekanntes Mitglied
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...
 

hdi

Top Contributor
@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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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 :D

PS: Wollte ich nur mal so sagen:D
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben