JPanel selbst stellt keinen Text dar. Entweder implementierst Du das selbst in einer eigenen Ableitung (per überschriebener [c]paintComponent(Graphics)[/c]) oder -- was in der Regel besser ist -- packst ein JLabel auf das JPanel.
aber habe nun das folgende problem:
ich möchte, dass auf dem JPanel gezeichnet wird, wenn der Button Suche betätigt wird.
So sieht der Code aus, sind zwar keine fehler beim kompilieren vorhanden, aber zeichnen lässt sich der String auch nicht, weiß jemand weiter?
Java:
ausgabe.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent arg0){if(lese(suchfeld.getText())==null){JFrame fehler =newJFrame("fehler");
fehler.setSize(300,200);JLabel fehlerhaft =newJLabel(" suchbegriff noch nicht vorhanden");
fehler.add(fehlerhaft);
fehler.setVisible(true);}finalObject help =lese(suchfeld.getText());
mixed=newJPanel(){@OverridepublicvoidpaintComponent(Graphics g){super.paintComponent(g);
g.drawString((String)help,120,130);}};
suchfeld.setText((String) help);}});}
Du legst ein neues Panel [c]mixed[/c] an, fügst es aber nirgends hinzu. Dein altes Panel [c]mixed[/c] lebt weiter, auch wenn Du den Wert der Variablen veränderst und das alte Panel über diese nun nicht mehr erreichst.
ok dann poste ich ma bisschen mehr code
Aso das mixed panel wurde schon bereits hinzugefügt und ich wollte, dass es mit der methode geändert wird.
Java:
classMyclassextendsJFrameimplementsMap{Myclass(){
mixed =newJPanel();add(mixed);}
ausgabe.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent arg0){if(lese(suchfeld.getText())==null){JOptionPane.showMessageDialog(null,"Der gesuchte Key ist noch nicht vorhanden","failed search ",JOptionPane.ERROR_MESSAGE);}finalObject help =lese(suchfeld.getText());
suchfeld.setText((String) help);
mixed=newJPanel(){publicvoidpaintComponent(Graphics g){
g.drawString((String)help,120,130);}};}});}
So sieht die Klasse vereinfacht aus, aber irgendwie funktioniert drawString trotzdem nicht, wenn ich Farbe ändern mache oder so geht das, aber das überschreiben der MEthode funktioniert irgendwie nicht;(
Weil man einem ActionListener kein JPanel zufügen kann. Und selbst wenn Du es per add in Deinen übergeordneten Container einfügst, hängt es von dessen LayoutManager ab wie und ob es korrekt eingefügt wird. Ausserdem müsste man da vermutlich noch ein validate() auf dem Container/ der übergeordneten Komponente aufrufen.
Wenn ich das richtig verstanden habe ändert sich doch nur der String. Warum lässt Du nicht einfach ein Panel in der GUI und änderst nur dessen String, anstatt immer ein neues Panel zu erzeugen und zu versuchen in die GUI zu stecken? Ähnlich wie man es mit einem JLabel machen würde.
ausgabe.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent arg0){if(lese(suchfeld.getText())!=null){finalObject help =lese(suchfeld.getText());
suchfeld.setText((String) help);
mixed.setVisible(false);remove(mixed);
mixed=newJPanel(){protectedvoidpaintComponent(Graphics g){
g.setColor(Color.RED);Font neu =newFont("Monospaced",Font.PLAIN,36);
g.setFont(neu);
g.drawString((String)help,50,50);}};add(mixed);}else{JOptionPane.showMessageDialog(null,"Der gesuchte Key ist noch nicht vorhanden","failed search ",JOptionPane.ERROR_MESSAGE);}}});}
So funktionierts nun, aber dein ansatz hört sich besser an
Wenn ich das richtig verstanden habe ändert sich doch nur der String. Warum lässt Du nicht einfach ein Panel in der GUI und änderst nur dessen String, anstatt immer ein neues Panel zu erzeugen und zu versuchen in die GUI zu stecken? Ähnlich wie man es mit einem JLabel machen würde.
Das Problem ist, ich würde gerne auf eine neue Klasse verzichten, und es mit einer anonymen lösen.
und ich müsste doch auch mit deiner Lösung dann jedes ma einen neuen Panel erstellen oder nich ?
Das kann man - warum auch immer - machen. Dann müsste halt die Klasse in der diese anonyme Klasse erzeugt wird den String text vorhalten und ggf. ein repaint auf das Panel aufrufen.
escript =newJPanel(){privateString text ="waz up ";privateFont font =newFont("Monospaced",Font.PLAIN,36);publicvoidsetText(String text){this.text = text;this.repaint();}publicvoidpaintComponent(Graphics g){super.paintComponent(g);
g.setColor(Color.RED);
g.setFont(font);
g.drawString(text,50,50);}};
das steht im Konstruktor in der Klasse und wie rufe ich dann die Methode setText auf , wenn mein button zeichne geklickt wirD????:L
Das geht dann bei einer anonymen Klasse nicht (s. meinen letzten Post) - ausser Du verwendest JLabel statt JPanel, das besitzt eine Methode setText, die man überschreiben kann.
Mit einer anonymen Klasse sollte es so in etwa funktionieren:
Java:
...privateString text ="";privateJPanel escript;publicWieAuchImmerdieKlasseHeisst(){...
escript =newJPanel(){privateFont font =newFont("Monospaced",Font.PLAIN,36);publicvoidpaintComponent(Graphics g){super.paintComponent(g);
g.setColor(Color.RED);
g.setFont(font);
g.drawString(text,50,50);}};...}...
Im ActionListener kannst Du dann (sofern er sich in der selben Klasse befindet) einfach