Veröffentlicht 31. Oktober 200915 j Hallo, ich möchte mit folgendem Code erreichen, dass bei einem Mausklick ein Rechteck an der Stelle des Mausklicks gezeichnet wird. Dabei möchte ich paint verwenden und GUI-und Anwendungscode trennen. Mein Problem: Mit getX() und getY() kann ich ja die Koordinaten des Mausklicks abfragen. Nur wie übergebe ich die Koordinaten nach paint??? import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CRechteck4 extends JFrame { Container mcp = getContentPane(); public static void main(String[] arg) { MainFrameCommand reaktion = new MainFrameCommand (); MainFrameGUI gui= new MainFrameGUI(reaktion); } } class MainFrameGUI extends JFrame { public MainFrameGUI(MouseListener cmd) { addMouseListener(cmd); setBackground(Color.white); setSize(800,800); setVisible(true); } public void paint (Graphics g) { g.setColor(Color.black); g.drawRect(30,40,500,700); } } class MainFrameCommand implements MouseListener { public void mouseClicked(MouseEvent e) { int x=e.getX(); int y=e.getY(); } public void mouseEntered(MouseEvent e){}; public void mouseExited(MouseEvent e){}; public void mousePressed(MouseEvent e){}; public void mouseReleased(MouseEvent e){}; }
31. Oktober 200915 j Ich hätte das mit anonymen Klassen gemacht: // in main nur MainFrameGUI gui= new MainFrameGUI(); class MainFrameGUI extends JFrame { private int x; // x und y als Klassenvariablen private int y; // sind nun allen Methoden zugänglich public MainFrameGUI() { // Nutze die Adapter-Klassen, um Dummy-Methoden zu vermeiden addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { x = e.getX(); y = e.getY(); // Kann nun z. B. direkt repaint() aufrufen } }); // ... } public void paint (Graphics g) { // kann auf x und y zugreifen } } Grüße, JasonDelife.
1. November 200915 j Hallo, danke für deine Antwort-mit anonymen Klassen geht es einfacher. Aber in der Aufgabe soll ich GUI und Anwendungslogik trennen und nicht alles in eine Klasse reinpacken. Hat jemand vielleicht noch eine Idee?
1. November 200915 j Am einfachsten, auch um im weiteren Verlauf nur dann ein Dreieck zu zeichnen, wenn ein Mausklick registriert wurde, braucht dein MouseListener eine Referenz auf deinen JFrame. Dann kannst du in der Klasse des JFrames eine Methode anlegen, der die Position des Mauszeigers übergeben wird und dann ein Neuzeichnen des JFrames einleitet und die Position speichert damit diese in der paint()-Methode benutzt werden kann. Dann kannst du, wenn ein Mausklick registriert wird, die Methode im JFrame aus deinem MouseListener aufrufen, übergibst die Position des Mauszeigers und zeichnest dann durch diesen Methodenaufruf den JFrame neu.
1. November 200915 j Am einfachsten, auch um im weiteren Verlauf nur dann ein Dreieck zu zeichnen, wenn ein Mausklick registriert wurde, braucht dein MouseListener eine Referenz auf deinen JFrame. Bins noch mal. Also du meinst in die Klasse MainFrameCommand soll so etwas wie MainFrameGUI test = new MainFrameGUI(); rein? Ich habe ja zwei Klassen, die von JFrame abgeleitet sind.
1. November 200915 j Nein, keine zweite neue Klasse von deinem JFrame, sondern eine Referenz auf deine schon erzeugte Klasse. Am einfachsten machste dass, in dem du deinem MouseListener einen Konstruktor verpasst, dem eine Referenz auf dein JFrame übergeben wird, und dieser dann die Referenz in einer Instanzvariable im MouseListener speichert. Genau dass selbe wie du bei deinem JFrame schon gemacht hast, dass du dort deinen MouseListener übergibst, wobei mir das erst gerade aufgefallen ist, was die Sache dann leider doch nicht so einfach macht. Vielleicht wäre es besser, wenn du den MouseListener an deinen JFrame nicht im Konstruktor des JFrames hinzufügst, sondern direkt in der main-Methode mit gui.addMouseListener(reaktion);
1. November 200915 j Kannst du mir vielleicht ansatzweise den Code geben? Besonders folgendes verstehe ich nicht: Am einfachsten machste dass, in dem du deinem MouseListener einen Konstruktor verpasst, dem eine Referenz auf dein JFrame übergeben wird, und dieser dann die Referenz in einer Instanzvariable im MouseListener speichert
3. November 200915 j So in der Art meinte ich das, aufpassen, dass ist kein vollständig funktionierende Code: main() { MainFrameGUI gui = new MainFrameGUI(); MainFrameCommand reaktion = new MainFrameCommand(gui); gui.addMouseListener(reaktion); } class MainFrameGUI extends JFrame { private Point mousePosition = new Point(0,0); ... public void setMousePosition(Point pos) { this.mousePosition = pos; } } class MainFrameCommand extends MouseAdapter { private MainFrameGUI parent = null; public MainFrameCommand(MainFrameGUI parent) { this.parent = parent; } public void mouseClicked(MouseEvent e) { this.parent.setMousePosition(new Point(e.getX(), e.getY()); } ... }
3. November 200915 j Hast du das erste Jahr in der Schule net aufgepasst oder ist der Lehrer Schuld dass du es net verstehst? Ist bestimmt ein ganz fauler Lehrer der einem nix beibringen kann, und die Zeit ist ja eh so knapp, oder? Und "die Aufgabe" will sicher net dass du einfach irgendwie mehrer Klassen machst. Dort geht es wohl eher um sinnvolle Trennung von GUI, Daten und Logik. Und das nennt sich MVC und ergibt sicher 1000000 Treffer bei Google bei denen alle erklärt wird..
7. November 200915 j Hast du das erste Jahr in der Schule net aufgepasst oder ist der Lehrer Schuld dass du es net verstehst? Ist bestimmt ein ganz fauler Lehrer der einem nix beibringen kann, und die Zeit ist ja eh so knapp, oder? Und "die Aufgabe" will sicher net dass du einfach irgendwie mehrer Klassen machst. Dort geht es wohl eher um sinnvolle Trennung von GUI, Daten und Logik. Und das nennt sich MVC und ergibt sicher 1000000 Treffer bei Google bei denen alle erklärt wird.. Was soll dieses Posting und dieser Ton? Es soll Leute geben, die arbeiten und vielleicht tatsächlich noch mehr zu tun haben. Könnte jeder alles bei Google nachschauen, bräuchte es ja keine Foren mehr geben.
9. November 200915 j Foren sind für allgemeine Diskussionen und spezifische Probleme. Foren sind nicht dazu da um allgemeine Informationen tausendfach zu duplizierern. Zudem gibt es auch hier im Forum viele Themen zum MVC-Pattern.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.