Fensterinhalt wird nicht angezeit

raptot

Mitglied
Hallo
ich habe ein kleines problem mit awt. Zuerst eine kleine Einführung wie mein Programm funktioniert:
Wenn das Programm gestartet wird, erzeugt es ein Objekt der Klasse StartupWindow, welches ein Fenster anzeigt mit mehren Textboxen und einem Button um die eingegebenen Daten zu bestätigen. Wenn man nun auf Ok klickt, wird dispose() ausgeführt und danach ein Objekt der Klasse EnergyGraph (dieses enthält übrigens auch die main methode) erzeugt, die Daten aus den Textfeldern werden im Konstruktor übergeben. Dann ruft StartupWindow die Methode runnow() aus der EnergyGraph-Klasse auf, welche die Daten verarbeitet und ein Objekt der Klasse GraphicInterface erzeugt, welches die Ausgabe graphisch darstellt.
Das Problem ist nun, dass GraphicInterface seit ich die Klasse StartupWindow hinzugefügt habe nur noch ein leeres Fenster darstellt. Nicht mal der X-Knopf oben am Fenster funktioniert. Vorher hat alles funktioniert, also bevor ich dieses StartupWindow geschrieben hab. Der Sinn dieser Klasse ist, dass ich das Programm nicht mehr über die Konsole mit Parameter starten muss, der StartupWindow soll dem Benutzer die möglichkeit geben beim Startup die Daten einzugeben.

Hier mal der Code vom StartupWindow, vielleicht hilft das:
Code:
import java.awt.*;
import java.awt.event.*;

public class StartupWindow extends Frame implements ActionListener{
    private static final long serialVersionUID = 1L;
    private String host;
    private int updaterate,timespan;
    private TextField hosttext, ratetext, timetext;
    
    public StartupWindow(String title){
        super(title);
        setLocation(300,150);
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc;
        setLayout(gbl);
        //Initialise host, updaterate and timespan
        this.host = "217.31.67.174";
        this.updaterate = 15;
        this.timespan = 48;
        
        //Host label
        gbc = makegbc(0,0,1,1);
        gbc.fill = GridBagConstraints.NONE;
        Label host = new Label("Host : ", Label.LEFT);
        gbl.setConstraints(host, gbc);
        add(host);
        //Host textbox
        gbc = makegbc(1,0,2,1);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        hosttext = new TextField(this.host);
        gbl.setConstraints(hosttext, gbc);
        add(hosttext);
        //Updaterate label
        gbc = makegbc(0,1,2,1);
        gbc.fill = GridBagConstraints.NONE;
        Label rate = new Label("Updaterate in Minuten : ", Label.LEFT);
        gbl.setConstraints(rate, gbc);
        add(rate);
        //Updaterate textbox
        gbc = makegbc(2,1,1,1);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        ratetext = new TextField(Integer.toString(this.updaterate));
        gbl.setConstraints(ratetext, gbc);
        add(ratetext);
        //Timespan label
        gbc = makegbc(0,2,2,1);
        gbc.fill = GridBagConstraints.NONE;
        Label time = new Label("Zeitspanne in Stunden : ", Label.LEFT);
        gbl.setConstraints(time, gbc);
        add(time);
        //Timespan textbox
        gbc = makegbc(2,2,1,1);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        timetext = new TextField(Integer.toString(this.timespan));
        gbl.setConstraints(timetext, gbc);
        add(timetext);
        //Start button
        gbc = makegbc(0,3,2,1);
        gbc.fill = GridBagConstraints.NONE;
        Button button = new Button("Start");
        gbl.setConstraints(button, gbc);
        button.addActionListener(this);
        add(button);
        pack();
        setVisible(false);
    }
    public void actionPerformed(ActionEvent event){
            if (event.getActionCommand().equals("Start")){
                setVisible(false);
                dispose();
                host = hosttext.getText();
                try {
                    updaterate = Integer.parseInt(ratetext.getText());
                } catch (NumberFormatException e) {
                    System.err.println("Updaterate wurde nicht als Zahl angeben");
                    System.exit(1);
                    }
                try {
                    timespan = Integer.parseInt(timetext.getText());
                } catch (NumberFormatException e) {
                    System.err.println("Zeitspanne wurde nicht als Zahl angeben");
                    System.exit(1);
                    }
                if ( updaterate<1 ){
                    System.err.println("Die minimale Updaterate ist 1 Minute");
                    System.exit(1);
                }
                if (timespan<6){
                    System.err.println("Die kleinste Zeitspanne sind 6 Stunden");
                    System.exit(1);
                }
                if (timespan>744){
                    System.err.println("Die größte Zeitspanne sind 744 Stunden (31 Tage)");
                    System.exit(1);
                }
                EnergyGraph e = new EnergyGraph(host,updaterate,timespan);
                e.runnow();
            }
        }
    
    private GridBagConstraints makegbc(int x, int y, int width, int height){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.insets = new Insets(1,1,1,1);
        gbc.weightx = 100;
        gbc.weighty = 100;
        return gbc;
    }
}
Soweit ich weiss, werden die Berechnungen alle durchgeführt, nur wird ausser dem leeren Fenster nichts angezeigt.

Helft mir bitte

Mit freundlichen Grüßen
Raptor
 
Also ich finds wundersam dass mit setVisible(false) überhaupt was angezeigt wird... wie auch immer... debuggen könnte helfen rauszufinden ob alles richtig berechnet wird. Bei Oberflächen machen es Farben immer sehr einfach zu schauen was denn überhaupt angezeigt wird.
 
Die main methode, die dieses StartupWindows erzeugt ruft setVisible(true) auf, und StartupWindow funktioniert ohne Probleme. Aber das zweite Fenster, mein GraphicInterface bleibt leer. Nicht einmal mein "WindowClosingAdapter" der es erlaubt das Fenster zu schliessen mithilfe der X-Schaltfläche funktioniert (Hat vorher immer funktioniert und funktioniert auch noch immer in der StartupWindow) funktioniert.
Wenn es hilft kann ich auch noch den Quellcode des GraphicInterface posten.

Hab es gerade nochmal ausprobiert, wenn ich
Code:
EnergyGraph e = new EnergyGraph(host,updaterate,timespan);
                e.runnow();
wobei ich host, updaterate und timespan natürlich durch testwerte ersetzt habe, von der main-methode aus aufrufe funktioniert alles.
hab übrigens das setVisible(false) entfernt...
 
Zuletzt bearbeitet:
Wie gesagt, verwende doch einen Debugger und schau mal ob in der Klasse GraphicInterface denn alles richtig aufgerufen wird.
 
Verwendest du ne Entwicklungsumgebung?

Ansonsten kannst du auch einfach ein paar System.out.println einbauen.
 
Ich verwende Eclipse. Also wie gesagt, ohne die StartupWindow funktioniert alles prima.
Hab aber deinen Rat befolgt und paar printlns eingebaut. StartupWindow überträgt die Daten korrekt, allerdings ist mir was im GraphicInterface aufgefallen. repaint() sollte doch eigentlich die paint() methode aufrufen. Aber genau das scheint nicht mehr zu passieren, weil mein println in der paint() methode sendet nichts. Hier ist der wichtigste teil des codes von graphicinterface

Code:
import java.awt.*;
import java.awt.image.BufferedImage;

public class GraphicInterface extends Frame{
    private static final long serialVersionUID = 1L;
    private int updaterate, datapoints, timespan,datapointph;
    private BufferedImage image;
    private CoordSys c;
    
    public GraphicInterface(String title, int updaterate, int timespan){
        super(title);
        setSize(1000,500);
        setLocation(20,20);
        setResizable(false);
        image = new BufferedImage(this.getSize().width,this.getSize().height,BufferedImage.TYPE_INT_ARGB);
        addWindowListener(new WindowClosingAdapter());
        this.updaterate = updaterate;
        this.timespan = timespan;
        datapointph = (60/this.updaterate);
        datapoints =datapointph*this.timespan;
        c = new CoordSys(this, datapoints);
        clear();
        drawgrid();
        setVisible(true);
    }
    public void paint( Graphics g ) {
        super.paint(g);
        System.out.println("Paint");
        g.drawImage(image,0,0,null);
    }
      public void clear() {
          Graphics g = image.getGraphics();
          g.setColor(Color.WHITE);
          g.fillRect(0,0,this.getSize().width,this.getSize().height);
          g.dispose();
          repaint();    
      }
                
    private void drawgrid(){
        System.out.println("Drawing grid");
        Graphics g = image.getGraphics();          
        g.setColor(Color.BLACK);
//Hier werden nun einige linien und string gezeichnet mit g.drawline()...
        
        g.dispose();
        repaint();
    }
    
    private void drawtime(String[][] data){
        Graphics g = image.getGraphics();          
        g.setColor(Color.BLACK);
        
      //Hier werden zeitdaten mit g.drawString() gezeichnet
        g.dispose();
        repaint();
    }
    
    private void drawdata(String[][] data){
        Graphics g = image.getGraphics();          
        g.setColor(Color.BLACK);
        
      
//Hier werden die Daten gezeichnet
        
        g.dispose();
        repaint();
    }
    public void drawnow(String[][] data){
        clear();
        drawgrid();
        drawtime(data);
        drawdata(data);
        }
    public void errormsg(String msg1, String msg2){
        ErrorDialog error = new ErrorDialog(this,true, msg1,msg2);
        error.setVisible(true);
    }
    }
 
Mit eclipse ist debugging wirklich sehr einfach.

Dort wo im Code angehalten werden soll machst du einen rechtsklick auf den weißen Bereich links neben einer Codezeile im Editorfenster und klickst auf Toggle Breakpoint. Nimm am Besten einfach erstmal was wo du sicher bist dass es ausgeführt wird.

Im Menü wählst du Run - Debug As - Java Application aus. eclipse wechselt dann in die Debugansicht und hält an deinen Breakpoints an. Dort kannst du dir dann alle aktuellen Wertebelegungen anschauen und mit dem Startbutton weiterlaufen lassen.

repaint führt nur ein paint aus sofern dein Fenster schon angezeigt wird. Im Konstruktor rufst du dein clear und drawgrid z.B. vor dem setVisible auf.

Insgesamt rufst du mir auch zu oft repaint selber auf. Eigentlich wird das ja eh schon aufgerufen wenn die Oberfläche das erst Mal angezeigt wird (und immer wenn sich größe etc ändern).
 
also ich bin offen für vorschläge. Du musst nur bedenken, dass das programm periodisch neue daten runterläd und anzeigt, deshalb die einzelnen funktionen und die repaint()s
Die fenstergröße wird nie geändert. Ich versteh halt nicht, wieso das Programm einwandfrei ohne die startupwindow funktioniert aber nicht mit eben jener.

Also ich eigentlich nicht sowiel ahnung von awt, hab mich an dem "Handbuch der Java Programmierung" inspiriert.
 
Zuletzt bearbeitet:
Kann es sein, dass AWT probleme damit hat, dass 2 Fenster offen sind? (Obwohl das ja eigentlich nicht der fall ist, aber das StartupWindow-Objekt existiert ja noch). Wie könnte ich es machen, dass mein Hauptprogramm auf die eingabe in der StartupWindow wartet, ohne dass StartupWindow selbst die runnow() methode aufruft?

Ich versteh auch nicht, wieso nicht einmal mein addWindowListener(...) funktioniert...
 
Zuletzt bearbeitet:
Zurück