ShamaN Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 Ich brauche ein GUI mit 5 Spalten und beliebig vielen Zeilen. In die erste Zeile sollen 5 Labels. In allen darauffolgenden Zeilen soll die erste Spalte leer sein( weil ich da mit der Methode paint Kreise rein malen möchte.) In alle restliche Zellen sollen Textfelder. Also mach ich zwei GridLayouts(1. einspaltig, 2.zweispaltig) und packe diese in ein Borderlayout und setze das 1. auf West und das 2. auf "East"... Aber das ganze funktioniert nicht. Hier der Quelltext dazu: import java.awt.*; import java.awt.event.*; import javax.swing.*; class Fenster extends Frame { public Fenster() { int x=5; int y=8; Panel p1 = new Panel(); setLayout(new GridLayout(1, y)); // Layoutmanger p1.add(new Label("Bewertung")); // Überschriften Panel p2 = new Panel(); setLayout(new GridLayout(x-1, y)); // Layoutmanger p2.add(new Label("Vorgang")); p2.add(new Label("Bearbeiter")); p2.add(new Label("Fälligkeit")); p2.add(new Label("Anmerkung")); for(int i=y; i!=2; i--) { p2.add(new TextField("")); // Datensätze p2.add(new TextField("")); p2.add(new TextField("")); p2.add(new TextField("")); } Panel p0 = new Panel(); setLayout(new BorderLayout()); p0.add(p1,"West"); p0.add(p2,"Center"); this.add(p0); this.add(new Button("Speichern")); this.addWindowListener(new WindowListener(true)); setBackground (Color.lightGray); setSize (500 ,(y+2)*30); setVisible (true); } Kann mir jemand helfen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 Für die Zukunft: Wenn du hier Quellcode postest, dann mach dir bitte die mühe es in CODE-Tags einzufügen. SO kann man den Code besser vom Rest des Textes unterscheiden und eventuelle Einrückungen bleiben erhalten. Ich werde mal deine Code kommentieren vielleicht hilft es dir. import java.awt.*; import java.awt.event.*; import javax.swing.*; //Du importierst das gesamte swing package benutzt aber nur awt. //Ich weiß auch nicht warum du nur awt benutz. Hat das einen //besonderen Grund? Da awt als veraltet angesehen werden kann, //wüsste ich jetzt keinen Grund warum man nicht swing benutzen sollte. class Fenster extends Frame { public Fenster() { int x=5; int y=8; Panel p1 = new Panel(); setLayout(new GridLayout(1, y)); //Du muss hier aufpassen! Das setLayout() wird hier für das Frame //aufgerufen nicht, wie du vielleicht wolltest, für das Panel. p1.add(new Label("Bewertung")); // Überschriften Panel p2 = new Panel(); setLayout(new GridLayout(x-1, y)); //hier wieder setLayout auf das Frame p2.add(new Label("Vorgang")); p2.add(new Label("Bearbeiter")); p2.add(new Label("Fälligkeit")); p2.add(new Label("Anmerkung")); for(int i=y; i!=2; i--) { //üblicherweise wird bei bei for-schleifen mit <, >, <= oder >= gearbeitet //und nicht mit != bzw == p2.add(new TextField("")); // Datensätze p2.add(new TextField("")); p2.add(new TextField("")); p2.add(new TextField("")); } Panel p0 = new Panel(); setLayout(new BorderLayout()); //setLayout.... p0.add(p1,"West"); //Hier solltest du p0.add(p1, BoderLayout.WEST); aufrufen p0.add(p2,"Center"); this.add(p0); this.add(new Button("Speichern")); //du hast beim letzten setLayout dem Frame das Borderlayout vergeben //und nun willst du p0 und den Button hinzufügen. wenn du dann keine //orientierung (z.B. Borderlayout.SOUTH) mitgibst werden die Komponenten //automatisch im Center eingefügt. So kommt es das der Button quasi "über" //dem Panel liegt this.addWindowListener(new WindowListener(true)); //diese Initialisierung von WindowListener ist schlichtweg nicht kompilierfähig, //da es sich hierbei um ein Interface handelt. setBackground (Color.lightGray); setSize (500 ,(y+2)*30); setVisible (true); } Wahrscheinlich ist es besser du beschäftigst dich noch einmal Grundlegend mit Java. Eine gute Quelle ist hier OpenBook Java ist auch eine Insel; Kapitel 15 und 16 handeln dabei von GUI-Programmierung aber es könnte die sicherlich nicht schaden auch nochmal den Rest zu "überfliegen". Aber auch ein Blick in die Java-Api kann nie schaden (z.B. steht dort auch drin wie man die Layouts benutzt). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 Mal von den von Wayne angesprochenen Problemen mal angesehen, warum machst du das mit 2 verschiedenen Panels? Wenn du 5 Spalten mit unendlichen vielen Zeilen haben willst, und davon die erste Zeile alle Spalten ne Überschrift haben und ab der 2. Zeile alle außer der ersten Spalte Textfelder sind, reicht doch vollkommen ein Panel mit dem GridLayout. Du sagst dem GirdLayout dann einfach, es soll maximal 5 Spalten haben, die Zeilenanzahl ist egal, fügst dann 5 Labels hinzu du die beschriftest, und für alle restlichen Zeilen fügst du ein leeres Label (auf dem du dann fröhlich zeichnen kannst) und danach 4 Textfelder ein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 27. Januar 2009 Autor Teilen Geschrieben 27. Januar 2009 weil dann kein Kreis auftaucht ^^ Ich nahm an, dass ich nicht auf ein Label zeichnen kann. Folgendes funktioniert z.b. nicht: public class Fenster extends Frame { Fenster() { super("fenster"); int x=5; int y=8; Panel p1 = new Panel(); setLayout(new GridLayout(y, 1)); // Layoutmanger add(new Label("Bewertung")); // Überschriften add(new Label("Vorgang")); add(new Label("Bearbeiter")); add(new Label("Fälligkeit")); add(new Label("Anmerkung")); for(int i=y; i!=2; i--) { add(new Label("")); // Datensätze add(new TextField("")); add(new TextField("")); add(new TextField("")); add(new TextField("")); } this.addWindowListener(new WindowListener(true)); this.setBackground(Color.lightGray); this.setSize(x*100,y*50); this.setVisible(true); } public void paint (Graphics g) { g.drawOval (40, 130, 15, 15); } } public class main { public static void main(String[] args) { Fenster f = new Fenster(); } } public class WindowListener extends WindowAdapter { private boolean ende; public WindowListener (boolean ende) { this.ende = ende; } //Konstruktoren public WindowListener () { this.ende = false; } public void windowClosing (WindowEvent event) //Methoden { event.getWindow().setVisible(false); event.getWindow().dispose(); if (ende) { System.exit(0); } } } Alles bis auf den Kreis wird angezeigt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 man kann wunderbar auf nem Label zeichnen, dazu müsstest du aber auch die Paint-Methode des Labels überschreiben. Hast du eigentlich Waynes Post überhaupt gelesen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 Ein letzter Versuch: Benutze bitte die CODE-Tags wenn du Code postest. Beim nächsten mal ohne wird keine Hilfe mehr von mir kommen. Dein Quellcode zeigt ganz eindeutig, dass du nur begrenzte Kenntnisse in Java / OOP-Programmierung allgemein zu haben scheinst. Das ist nicht schlimm, da jeder einmal anfängt, aber du solltest dir wirklich noch einmal das ein oder andere (Online-) Buch oder Tutorial durchlesen. Dein Code strotz nur so von Fehlern, das es am besten ist du fängst neu an und arbeitest dich in _kleinen_ Schritten vorwärts. @Dragon8: Mich beschleicht das Gefühl, dass er das nicht hat. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 27. Januar 2009 Autor Teilen Geschrieben 27. Januar 2009 Tut mir leid, ich hab die Kommentare, die du mir in den Quellcode geschrieben hast völlig überlesen, jetz wird mir einiges klar ^^. Ist schon was länger her, dass ich Java programmiert hab und hab mir für das Programm Code aus meinen damaligen Programmen rauskopiert. Da hab ich awt einfacher verstanden. ^^ Die Kommentare sind hilfreich aber this.addWindowListener(new WindowListener(true)); //diese Initialisierung von WindowListener ist schlichtweg nicht kompilierfähig, //da es sich hierbei um ein Interface handelt. will mir nicht ganz einleuchten. Jetzt hab ich mich mal etwas informiert wie ich die paint Methode eines Labels überschreibe und kam zu folgendem Ergebnis: class test extends label{ void paint(Graphics g) { super.draw(g) g.drawoval(123,12,345,23); }} Kann das aber leider nicht mehr vor morgen testen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 27. Januar 2009 Teilen Geschrieben 27. Januar 2009 Der Kommentar zu deinem WindowListener lag einfach daran, dass du im ersten Post uns nicht mitgeschrieben hast, dass bei dir der WindowListener eine eigen Klasse ist, die vom WindowsAdapter erbt. Wir sind jetzt einfach davon ausgegangen dass du dort das normale Interface WindowListener meinst, und so ist der Code nunmal nich ausführbar gewesen. Das mit der überschriebenen paint()-Methode sieht in Ordnung aus, solange du die restlichen Fehler in deinem vorherigen Quellcode noch ausmerzt, könnte das langsam auch was werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 28. Januar 2009 Autor Teilen Geschrieben 28. Januar 2009 Jetzt hab ich nochmal ein wenig gewerkelt aber ein Kreis fehlt immer noch ^^ import java.awt.*; public class Fenster extends Frame { Fenster() { super("fenster"); int x=5; int y=8; int a=2; //Anzahl der "nicht-Datensätze" im GridLayout Panel p1 = new Panel(); p1.setLayout(new GridLayout(y+a, x)); // Layoutmanger p1.add(new Label("Bewertung")); // Überschriften p1.add(new Label("Vorgang")); p1.add(new Label("Bearbeiter")); p1.add(new Label("Fälligkeit")); p1.add(new Label("Anmerkung")); for(int i=y; i>0; i--) { p1.add(new Label()); // Datensätze p1.add(new TextField("")); p1.add(new TextField("")); p1.add(new TextField("")); p1.add(new TextField("")); } p1.add(new Button("Speichern")); this.add (p1); //Layout auf das Frame setzen this.addWindowListener(new WindowListener(true)); this.setBackground(Color.lightGray); this.setSize(x*100,y*40); this.setVisible(true); } public void paint (Graphics g) { //g.setColor(Color.RED); //g.drawOval (40, 130, 15, 15); } } public class myLabel extends Label { public void paint(Graphics g) { super.paint(g); g.setColor(Color.RED); g.drawOval(50,150,15,15); } } main und WIndowListener wie vorher auch schon. Die Anordnung auf dem Frame sitzt bis auf den fehlenden Kreis. Muss ich vllt noch einen Konstruktor für meine Klasse myLabel schreiben und den von der Klasse Fenster aufrufen wenn ich auf dem jeweiligen Label zeichnen möchte? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 28. Januar 2009 Teilen Geschrieben 28. Januar 2009 Naja du hast halt super die Klasse Label überschrieben und dort ne neue paint()-Methode definiert, jedoch solltest du in deiner while-Schleife auch eine Instanz deiner eigenen Klasse zum Panel hinzufügen, und nicht das ganz normale Label Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 28. Januar 2009 Autor Teilen Geschrieben 28. Januar 2009 (bearbeitet) ich weiss nicht ob ich das jetzt richtig verstanden habe, ich hab mal folgendes verändert: //In der Klasse Fenster... for(int i=y; i>0; i--) { p1.add(new myJLabel("")); // Datensätze p1.add(new JTextField("")); p1.add(new JTextField("")); p1.add(new JTextField("")); p1.add(new JTextField("")); } public class myJLabel extends JLabel { public myJLabel(String text) //Konstruktor { super.addNotify(); setText(text); } public String getText() { return super.getText(); } public synchronized void setText(String text) { super.setText(text); } public void paint(Graphics g) { super.paint(g); g.setColor(Color.RED); g.drawOval(50,60,15,15); } } Jetzt erzeuge ich doch ein Objekt meiner eigenen Klasse myJLabel welches übermalt werden können sollte? PS: Ich hab das ganze jetzt mal in swing umgeändert. EDIT: funktioniert jetzt, Ich hab die Koordinaten vom Frame aus eingestellt und nicht vom Label Danke Bearbeitet 28. Januar 2009 von ShamaN Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 (bearbeitet) Soo... Jetzt habe ich weiter programmiert und möchte eine Menüleiste in mein Programm einführen. Das habe ich auch gemacht, allerdings wird anstatt der Menüleiste der Hintergrund gezeigt, also ein Teil der Eclipse, als ob die Menüleiste durchsichtig wär. Dieser bleibt auch wenn ich das Fenster verschiebe. Wenn ich einmal darauf klicke kommt dann meine Menüleiste, allerdings wenn ich auf ein Menü klicke, werden die Menüitems von meinen Gridlayout überdeckt. Andersrum wäre es mir logischerweise lieber Hier mal der relevante Code: Panel p1 = new Panel(); p1.setLayout(new GridLayout(y+a, x)); // Layoutmanger p1.add(new JLabel("Bewertung")); // Überschriften ausgeben p1.add(new JLabel("Vorgang")); p1.add(new JLabel("Bearbeiter")); p1.add(new JLabel("Fälligkeit")); p1.add(new JLabel("Anmerkung")); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu( "Datei" ); fileMenu.add(new JMenuItem("Datenbank öffnen")); fileMenu.add(new JMenuItem("Speichern")); fileMenu.add(new JMenuItem("Beenden")); menuBar.add( fileMenu ); this.setJMenuBar( menuBar ); this.add(p1); EDIT: Problem gelöst^^ hab Panel durch JPanel ersetzt, vllt sollte ich mal länger nachdenken ^^ Bearbeitet 29. Januar 2009 von ShamaN Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Dasselbe Problem hatten wir vor ein paar Tagen hier doch schonmal im Forum, bei demjenige lag das Problem daran, dass er awt und swing Komponenten miteinander vermischt hatte. Und wenn ich mir dein Code-Ausschnitt anschaue, seh ich da auch wieder nen normales Panel...also awt, wobei dein Menü swing sein soll. Also entscheide dich, ob du nun awt oder swing verwenden willst, und bleib genau einem von beidem, aber nicht beides vermischen, dass führt öfters mal zu komischen Fehlern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 (bearbeitet) Folgendes neues Problem: Ich erstelle mit dem Konstruktor ein Frame, darin setze ich TextFelder und Labels in ein JPanel, welches ich als protected in der Klasse deklariert habe: protected JPanel p1 = new JPanel(); //Innerhalb des Konstruktors... p1 = new JPanel(); p1.setLayout(new GridLayout(y, x)); p1.add(new JLabel); Jetzt möchte ich aber durch Klicken eines Buttons neue Textfelder in das Panel einfügen... Da dachte ich mir folgendes... public void actionPerformed (ActionEvent e) { if (e.getSource()==newdata) { for(int i=0; i<4; i++) { x++; Felder.add(new JTextField("")); p1.add((JTextField)Felder.get(Felder.size())); } } } Felder ist eine ArrayList. Problematisch ist noch, dass das GridLayout mit der Anzahl y an Zeilen deklariert wurde. y wird dem Konstruktor übergeben. EDIT: Sinn des ganzen ist ein GUI welches mit einer mySql-Datenbank kommuniziert Bei dem aktuellen Problem möchte ich über den Button "Neuen Datensatz" eine neue Zeile aus Textfeldern erstellen, welche sich in die Datenbank speichern lässt. Bearbeitet 29. Januar 2009 von ShamaN Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Wäre es vll dann nicht einfacher die Komponente JTable zu verwenden, als mühsam zu versuchen eine tabellenartige Form in deiner GUI nach zu programmieren? Ansonsten wenn du das unbedingt so machen willst, dann setzte bei der Inistalisierung deines GridLayouts die Anzahl der Reihen auf 0. Dann fügt er neuhinzugefügte Komponente immer so an, dass die Anzahl der Spalten beibehalten wird, sodass er einfach immer nur neue Reihen hinzufügt. Wenn du jedoch sowohl Reihen als auch Spalten festlegt, dann wird er immer die Reihen als feste Größe nehmen und, sobald du mehr Komponenten hinzufügst als das Grid eigentlich beherbergen kann, neuen Spalten hinzufügen um die neuen Komponenten einzufügen. Wird in der Doku des GridLayouts aber auch angesprochen: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/GridLayout.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 29. Januar 2009 Autor Teilen Geschrieben 29. Januar 2009 Dann werden mir die im ActionListener erstellen Textfelder aber immer noch nicht auf dem Frame angezeigt. Dieser Code müsste allerdings auch fehlerhaft sein: public void actionPerformed (ActionEvent e) { if (e.getSource()==newdata) { for(int i=0; i<4; i++) { Felder.add(new JTextField("")); p1.add((JTextField)Felder.get(Felder.size())); } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 29. Januar 2009 Teilen Geschrieben 29. Januar 2009 Dass die Textfelder danach noch immer nicht zu sehen sind, wird vll daran liegen dass der Frame neu gezeichnet werden muss, ansonsten werden da die neuen Komponenten nicht angezeigt. Das schaffste am einfachsten, in dem du setVisible(true) nochmal auf dem Frame aufrufst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 So... Nun möchte ich durch Anklicken eines bestimmten Punktes auf meinem myJLabel die Variable private int bewertung = 1; in der Klasse myJLabel ändern. Aso hab ich eine Klasse MyMouseListener geschrieben, in welcher ich mit getComponent() das myJLabel haben möchte, was natürlich nicht funktioniert ^^ import java.awt.event.MouseEvent; public class MyMouseListener { public void mouseClicked (MouseEvent me) { int x = me.getX(); int y = me.getY(); if (me.getButton() == 1) // Reaktion auf den Mausklick { if((x > 15 && y > 10) && (x < 30 && y < 25)) { me.getComponent().setBewertung(1); } if((x > 45 && y > 10) && (x < 60 && y < 25)) { me.getComponent().setBewertung(2); } if((x > 75 && y > 10) && (x < 90 && y < 25)) { me.getComponent().setBewertung(3); } } } } darum habe ich die Methode getComponent in der Klasse myJLabel eingefügt public myJLabel getComponent() { return (this); } was natürlich auch nicht funktioniert ;D Außerdem habe ich folgende Zeile im Konstruktor des myJLabel eingefügt: this.addMouseListener(new MyMouseListener()); welches auch nen Fehler auswirft: The method addMouseListener(MouseListener) in the type Component is not applicable for the arguments (MyMouseListener) Eclipse schlägt mir vor die Zeile folgendermaßen zu ändern: this.addMouseListener((MouseListener) new MyMouseListener()); Sieht für mich aber irgendwie zu einfach aus. Jemand ne Ahnung was ich falsch mache? bzw. was ich machen muss um das ganze zum Laufen zu bringen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 Yupp, die Fehler lassen sich alle in deinem MouseListener beheben. Fangen wir mal mit dem Fehler an, dass du deinen eigenen MouseListener nicht dem JLabel hinzufügen kannst, das liegt ganz einfach daran, dass du dort nur einen Listener hinzufügen kannst, der das Interface MouseListener implementiert. Das solltest du bei deinem Listener dann also noch machen. Und zu deinem anderem Problem, ich denke ja mal, dass die Methode setBewertung(int) in deiner Klasse myLabel definiert ist. Dann dürftest du in deinem Listener folgendermaßen auf diese Methode zugreifen können. ((myLabel)me.getComponent()).setBewertung(int); Die Methode getComponent() des MouseEvent gibt nämlich nur ein Objekt vom Typ Component zurück, das heißt, du kannst dort also auch nur Methoden aufrufen, die einem Component-Objekt bekannt sind. Willst du also Methoden aufrufen deiner Klasse myLabel aufrufen, musst du dieses Component-Objekt erstmal nach myLabel umwandeln und kannst dann auch die Methoden deiner Klasse aufrufen. Das funktioniert natürlich nur, weil deine Klasse indirekt von Component erbt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 In der Klasse public class myJLabel extends JLabel Im Konstruktor public myJLabel(String text, int bewertung) //Konstruktor { super.addNotify(); setText(text); this.bewertung = bewertung; this.addMouseListener((MouseListener) new MyMouseListener()); } bekomme ich jetz eine NullPointerException ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 Und welche Zeile gibt er als Fehlerzeile an? Hast du die Sachen aus meinem vorherigen Post beachtet? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 In der Zeile this.addMouseListener((MouseListener) new MyMouseListener()); Und... Fangen wir mal mit dem Fehler an, dass du deinen eigenen MouseListener nicht dem JLabel hinzufügen kannst, das liegt ganz einfach daran, dass du dort nur einen Listener hinzufügen kannst, der das Interface MouseListener implementiert. Das solltest du bei deinem Listener dann also noch machen. hab ich möglicherweise nicht richtig verstanden.... Mein MyMouseListener sieht jetz so aus: import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MyMouseListener extends MouseAdapter implements MouseListener { public void mouseClicked (MouseEvent me) { int x = me.getX(); int y = me.getY(); if (me.getButton() == 1) // Reaktion auf den Mausklick { if((x > 15 && y > 10) && (x < 30 && y < 25)) { ((myJLabel)me.getComponent()).setBewertung(1); ((myJLabel)me.getComponent()).setVisible(true); System.out.println("rot"); } if((x > 45 && y > 10) && (x < 60 && y < 25)) { ((myJLabel)me.getComponent()).setBewertung(2); ((myJLabel)me.getComponent()).setVisible(true); System.out.println("gelb"); } if((x > 75 && y > 10) && (x < 90 && y < 25)) { ((myJLabel)me.getComponent()).setBewertung(3); ((myJLabel)me.getComponent()).setVisible(true); System.out.println("grün"); } } } } MyJLabel public class myJLabel extends JLabel { private int bewertung = 1; public myJLabel(String text, int bewertung) //Konstruktor { super.addNotify(); setText(text); this.bewertung = bewertung; this.addMouseListener((MouseListener)new MyMouseListener()); } //Methoden public myJLabel getComponent() { return (this); } public int getBewertung() Fehlen noch ein paar unrelevante Zeilen Code EDIT: Irgendwo muss ich auch nochmal meinen Frame aktualisieren? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 Wenn dein MyMouseListener von MouseAdapter erbt brauchste das Interface MouseListener nicht mehr implementieren, das geschieht schon im MouseAdapter. Dadurch, dass MyMouseListener nun indirekt das Interface MouseListener implementiert, kannste in deinem Konstruktor jetzt auch einfach folgendes schreiben: this.addMouseListener(new MyMouseListener()); Dann kannste die getComponent() Methode aus deiner Klasse MyLabel wieder löschen, solange du die gerade nich anderweitig gebrauchst. Und seh ich das richtig, du hast in deiner Klasse MyLabel keine Methode setBewertung(int)? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 Kann das jetzt gerade leider nicht testen :/ Die Methode setBewertung ist da, hab sie nur nicht mitkopiert, wollts übersichtlich halten ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShamaN Geschrieben 1. Februar 2009 Autor Teilen Geschrieben 1. Februar 2009 Die NullPointer Exception ist immer noch da: Exception in thread "main" java.lang.NullPointerException at java.awt.Component.addMouseListener(Unknown Source) at asdf.myJLabel.<init>(myJLabel.java:20) Sieht für mich so aus als könne man keinen MouseListener an ein Component, in diesem Fall Label, anhängen Zeile 20 ist this.addMouseListener(new MyMouseListener()); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.