swing komponenten werden nicht angezeigt

  • Themenstarter Themenstarter oODARIOo2
  • Beginndatum Beginndatum
O

oODARIOo2

Gast
hi liebe community,
ich bin ein totaler anfänger in java und habe versucht ein kleines Programm zu schreiben. Man kann damit sogenannte milos (name kommt von privater vorgeschichte) zählen und dann ein verhältnis ausrechnen. Das problem ist dass nachdem ich ein swing komponent entfernt habe und ein neues hinzugefügt, das neue nicht angezeigt wird, ausser ich verändere die grösse des Fensters. Ich dachte das liegt daran dass es das dann Fenster neu ladet weil es dabei die paint() methode aufruft, und habe somit eine repaint() methode eingefügt, die aber irgendwie nichts nützt...

hier noch der quellcode:

Java:
 import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math.*;

class milorechner {

 double miloeinheiten = 0;
 double endwertberechner = 0;
 boolean rechenbeginner = false;
 boolean neustarter = false;
 boolean weiterfahrer = false;
 int schleiffe = 1;
 
 double minuten;
 double endwert;
 String ergebnis;
 
 JFrame frame;
 JButton milozähler;
 NumberField anzahlminuten;
 JButton rechenausloeser;
 
 public static void main(String []args) {

  milorechner ausführer = new milorechner();
  ausführer.los();

 }

 public void los() {

  JFrame frame = new JFrame();
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  JButton milozähler = new JButton("+1");
  Font zählerfont = new Font("Calibri", Font.PLAIN, 90);
  milozähler.setFont(zählerfont);
  milozähler.addActionListener(new zählerListener());
  frame.getContentPane().add(BorderLayout.CENTER, milozähler);

  JPanel panel = new JPanel();
  frame.getContentPane().add(BorderLayout.SOUTH, panel);

  NumberField anzahlminuten = new NumberField();
  anzahlminuten.setDouble(0);
  panel.add(BorderLayout.WEST, anzahlminuten);

  frame.setSize(480,800);
  frame.setVisible(true);
  
  JLabel endzeiger = new JLabel();
  Font endzeigerfont = new Font("Calibri", Font.PLAIN, 30);
  endzeiger.setFont(endzeigerfont);
  
  JButton neustart = new JButton("neustarten");
  neustart.addActionListener(new neustartListener());
  
  JButton weiterfahren = new JButton("weiterfahren");
  weiterfahren.addActionListener(new weiterfahrenListener());

  JButton rechenausloeser = new JButton("berechne milo/min");
  rechenausloeser.addActionListener(new rechenListener());
  panel.add(BorderLayout.CENTER, rechenausloeser);
  
  while (schleiffe == 1) {

   if (rechenbeginner == true) {

    minuten = anzahlminuten.getDouble();
    endwertberechner = miloeinheiten/minuten;
    endwert = Math.round(endwertberechner*100)/100.0;
    ergebnis = String.valueOf(endwert);

    panel.removeAll();
    endzeiger.setText(ergebnis + " milo/min ");
    panel.add(BorderLayout.CENTER,endzeiger);
    
    panel.add(BorderLayout.EAST, neustart);
    panel.add(BorderLayout.EAST, weiterfahren);
    
    rechenbeginner = false;

   }
   
   if (neustarter == true) {

    anzahlminuten.setDouble(0);
    panel.removeAll();
    panel.add(BorderLayout.WEST, anzahlminuten);
    panel.add(BorderLayout.CENTER, rechenausloeser);
    miloeinheiten = 0;
    
    neustarter = false;

   }
   
   if (weiterfahrer == true) {

    anzahlminuten.setDouble(0);
    panel.removeAll();
    panel.add(BorderLayout.WEST, anzahlminuten);
    panel.add(BorderLayout.CENTER, rechenausloeser);
    
    weiterfahrer = false;

   }
   
   panel.repaint();

  }

 }

 public class zählerListener implements ActionListener {

  public void actionPerformed(ActionEvent event) {

   miloeinheiten++;

  }

 }
 
 public class rechenListener implements ActionListener {

  public void actionPerformed(ActionEvent event) {

   rechenbeginner = true;

  }

 }
 
 public class neustartListener implements ActionListener {

  public void actionPerformed(ActionEvent event) {

   neustarter = true;

  }

 }
 
 public class weiterfahrenListener implements ActionListener {

  public void actionPerformed(ActionEvent event) {

   weiterfahrer = true;

  }

 }

}

danke schon im voraus 🙂
 
aua ...
convetions nicht eingehalten und vier mal eine innere klasse für einen actionlistener ? junge was soll das denn werden ? OOP hast du scheinbar noch nie gehört oder ?


zum problem

das problem ist das der layout-manager das nicht bekommt ...

du musst nach dem verändern deines JFrame auf dieses "revalidate()" und "update(Graphics)" callen ... ergo : JFrame sollte außerhalb deiner methode sichtbar sein ...

ansonsten : ziemlich grausig
 
update(Graphics) von Hand aufrufen zu wollen ist auch grausig. Wohlgemerkt: AUCH. Der Code ist wirklich ziemlich häßlich. Vermutlich würde es schon helfen, das
frame.setSize(480,800);
frame.setVisible(true);
GANZ am Ende zu machen (wenn alles zum Frame hinzugefügt wurde) aber... dieses Konstrukt mir der while-Schleife und remove und alles... das wird sofort noch zu anderen Problemen führen...
 
gut ... ob nun update(Graphics) selbst callen oder von repaint() machen lassen ...
ist an sich kein unterschied so lange keine paint-irgendwas methode überschrieben wurde was ja hier nicht der fall ist
 
Die Endlosschleife
Code:
while( schlieffe == 1)
würde ich dringend löschen. Die Inhalte der einzelnen
Code:
if
s kannst du auch direkt in die ActionListener schreiben (oder in eine Methode, welche von den ActionListenern aufgerufen wird).

P.S. ich finde die inneren Klassen als ActionListeners nicht so schlecht, es gibt wesentlich schlimmere Lösungen.
 
danke für eure antworten, trotz meinem hässlichen aufbau 😀 hat funktioniert.
und ja ich bin mir selber bewusst wie kacke das geschrieben ist aber ich wollte mal das gelernte irgendwie in die tat umsetzen um es zu verfestigen bevor ich weiterlerne 🙂
 

Zurück
Oben