Probleme mit Grafiken zeichnen

evoleena

Erfahrenes Mitglied
Hallo Leute

Ich bin ein absolute Anfängerin was Java angeht. Bin gerade dabei ein Applikation zu gestalten. Ich möchte mein GUI gerne 2 Teilen, rechts soll die Grafik hin, und links soll die Steuerung dazu hin, also Buttons, Textfelder und Labels.
In der Grafik sollen Geometrien angezeigt werden, wenn der Benutzer mit der Maus reinklickt bzw. wenn auf einen Knopf gedrückt wird

Ich weiß halt schon nicht wie ich rechts noch die Grafik hinbekommen soll. Habs jetzt damit versucht ein JPanel anzulegen nur leider wird nix angezeigt..

Code:
JPanel panel = new JPanel(){
     protected void paintComponent(Graphics g) {
           super.paintComponent(g);
           paintOnPanel(g);
           panel.setBackground(Color.CYAN);
           panel.setSize(200,300);
     };
};        

private void paintOnPanel(Graphics g) {
     g.drawString( "\"Maja, wo bist du?\" (Mittermeier)", 120, 60 );
}


Ich hoffe ihr könnte mir helfen bin schon am verzweifeln weil ich nicht weiß wie ich es noch anstellen soll.
Gruss
Evo
 
Moin,

machst Du eventuell etwas falsch, wenn Du das Panel zu einem JFrame oder anderen JPanel hinzufügst?

Ich habe das auf die Schnelle mal umgebaut und bei mir funktioniert das ohne Probleme:
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author Xandro
 */
public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 120);
        frame.setLocationRelativeTo(null);
        JPanel panel = new JPanel() {

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawString("\"Maja, wo bist du?\" (Mittermeier)", 60, 50);
                setBackground(Color.CYAN);
            };
        };
        frame.getContentPane().add(panel);
        frame.setVisible(true);
    }
}

Gruß,
Xan
 
Danke für die Antwort ich habs jetzt irgendwie doch noch hinbekommen
Hab das Panel gelassen und hab dann ein Canvas darauf gelegt

Code:
Canvas DrawingArea = new Canvas();
        DrawingArea.setSize(500, 530);
        DrawingArea.setBackground(Color.PINK);
        panel.add(DrawingArea);

Es funktioniert ist doch bestimmt auch in Ordnung so oder?

Jetzt muss ich nur noch rausbekommen wie man da was reinmalt ;)

Das Canvas hab ich nämlich in dem Konstruktor angelegt, wo auch mein Panel gestaltet wird.
Wie kann ich nun, wenn der User mit der Maus auf das Canvas klickt z.B. ein Rechteck reinmalen?
Muss ich da eine extra Funktion für das Malen einbauen und eine für den Maus Event?

Gruss
Evo
 
Zuletzt bearbeitet:
mhh ich bekomms nicht hin, da einen Mouseevent in die Grafik (Canvas) einzubauen
Kann mir denn niemand helfen

Code:
public static void main(String[] args) {
   Kmeans frame = new Kmeans();
   frame.setTitle("Kmeans Demo-Programm");

   Canvas DrawingArea = new Canvas();
   DrawingArea.setSize(500, 530);
   DrawingArea.setBackground(Color.PINK);
   frame.panel.add(DrawingArea);
            
   /*DrawingArea.addMouseMotionListener(new MyMotionListener());
   DrawingArea.addMouseListener(new MyMouseListener());*/
   /*panel.addMouseMotionListener(new MyMotionListener());
   panel.addMouseListener(new MyMouseListener());*/

   frame.setSize(800,600);
   frame.setVisible(true);	
}

Ich habs jetzt einmal versucht es dem Canvas zu geben und einmal dem Panel direkt aber da meckert der Compiler nur rum.
 
Moin,

natürlich musst Du definieren, was bei einem Klick passieren soll.
Das Programm weiß ja schließlich nicht von alleine, was geschehen wird. ;-)

Hier wieder ein Beispiel von mir, aber ohne Dein Canvas - weil ich ehrlich gesagt nicht verstehe, was Du damit willst *g*

Java:
package snippets.tutorials.evoleena;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 
 * @author Xandro
 */
public class Test {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        GraphicPanel panel = new GraphicPanel();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 300);
        frame.add(panel);
        frame.setVisible(true);
    }
}

class GraphicPanel extends JPanel {

    public GraphicPanel() {
        addMyMouseListener();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.CYAN);
    }

    public void paintRectangle(int x, int y) {
        getGraphics().drawRect(x, y, 20, 20);
    }

    public void addMyMouseListener() {
        addMouseListener(new java.awt.event.MouseAdapter() {

            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                paintRectangle(evt.getX(), evt.getY());
            }
        });
    }
}

Gruß,
Xan
 
Ich bin halt noch totaler Anfänger daher weiß ich noch nicht so recht ob Canvas oder nicht.
Gut dann bau ich meine Applikation noch mal mit deinem auf.

Wie sieht es dann eigentlich aus wenn ich dann die Anordnung der Elemente mache, mache ich die auch in der void main funktion oder drüber, oder kann man da eine extra Funktion schreiben

Und dann möchte ich neben der Grafik ja eine Steuerung hin haben, muss ich dafür ein extra panel anlegen, oder kann man das alles in eins mache.
 
Zuletzt bearbeitet:
Moin,

dass Du Anfänger bist ist ja nicht so schlimm :)
Es wunderte mich halt nur, wieso Du Canvas dort mit eingebaut hast, wenn Du doch ein Panel nutzen willst.

Also normal wird die Anordnung der Elemente (Buttons, Label, usw.) in einer extra Methode durchgeführt. Das kann aber von den unterschiedlichen Programmierstilen abhängen.
Wie ich das so vermute, hast Du noch nie wirklich eine GUI aufgebaut, richtig?
Mit welcher Programmierumgebung arbeitest Du denn? Eclipse, NetBeans, TextEditor?
In Eclipse und NetBeans gäbe es nämlich sogenannte Designer, mit denen Du Dir so ziemlich alles zusammenklicken kannst - in AWT und Swing.
Vielleicht solltest Du mal solch einen Designer testen und schauen, was für Code dieser generiert. Daran erkennst Du nämlich dann auch den ungefähren Aufbau von solch einer GUI.

Also es gibt eine Hand voll sogenannter LayoutManager, welche für die Anordnung von Komponenten zuständig sind. Über diese könntest Du Deine Grafik und die Steuerelemente ausrichten.

Da Du - wie Du selbst sagst - Anfänger bist, kann ich Dir nur das folgende Tutorial empfehlen, um zu verstehen, wie das ganze System bezüglich der GUI-Programmierung aufgebaut ist:
https://java.sun.com/docs/books/tutorial/uiswing/TOC.html

Es gibt noch weitere Tutorials, jedoch kommt diese von SUN selbst und ist meiner Meinung nach auch das Beste.

Gruß,
Xan
 
Huhu danke für deine Antwort.
Ja hab noch nie eins gebaut ;(
Eigentlich wollte ich ja netbeans benutzen aber da musste ich feststellen, das ich kein leeres Projekt erstellen kann.
Deshalb hab ich dann einfach joe genommen, wo ja nicht wirklich was mit Hilfe ist.

Also ich hab jetzt ein 2. Panel erstellt, wo meine Steuerung drauf ist, aber ich bekomme das nicht so ausgerichtet das es links anfängt.

Code:
	  frame.setLocationRelativeTo(null);
	  frame.setLayout( new FlowLayout());
 
Also,

der von Dir gepostete Code ist schlichtweg falsch.
Man ändert nicht das Layout auf einem Frame, sondern man ändert das Layout von dem ContentPane, welches der Frame einschließt.
Das heißt, Du müsstest für das Setzen des Layout das ContentPane ansprechen:
Java:
frame.getContentPane().setLayout(new FlowLayout);
Und auf dieses ContentPane kommen alle anderen Komponenten.

Und was meinst Du damit, dass man in NetBeans kein leeres Projekt erstellen kann?
Das geht sehr wohl, nur ist der Aufbau von Projekten halt anders als der Aufbau von einzelnen Java-Code-Dateien.

Gruß,
Xan
 
Ah ich hab das jetzt mit Netbeans hinbekommen.
Aber geht es auch, solche Aktionen mit dem Rechtecken in dem Panel auch soweit zusammen zu klicken
 
Zurück