2017-04-15 2 views
0

Die Titelleiste zeigt erst nach dem Klick run, der Rahmen funktioniert nicht .... Hier ist mein Code Ich habe keine Ideen, was los ist! Kann mir jemand helfen?Nur Titelleiste zeigt, der JFrame zeigt nicht

import java.awt.Canvas; 
import javax.swing.JFrame; 


public class Display extends Canvas implements Runnable { 

    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 800; 
    public static final int HEIGH = 600; 
    public static String TITLE = "3D Game"; 

    private Thread thread; 
    private boolean running = false; 
    private void start(){ 
     if(running) return; 
     running = true; 
     thread = new Thread(); 
     thread.start(); 

     System.out.println("Working"); 
    } 

    private void stop(){ 
     if(!running) 
      return; 
     running = false; 
     try{ 
     thread.join(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
      System.exit(0); 
    } 
    } 
    public void run(){ 
     while(running){ 

     } 
    } 



    public static void main(String[] args){ 

     Display game = new Display(); 
     JFrame frame = new JFrame(); 
     frame.add(game); 
     //frame.pack(); 
     frame.setTitle(TITLE); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(WIDTH,HEIGHT); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     game.start(); 

    } 


} 
+0

Sie 'while-loop' frei ausgeführt wird, dass es alle CPU-Zyklen verbrauchen bedeutet und Ihre UI zum Stillstand bringen (wie der UI-Thread keine ist keine Chance zu laufen) – MadProgrammer

Antwort

2

im Unterschied Werfen Sie einen Blick zwischen

public static final int HEIGH = 600; 

und

frame.setSize(WIDTH, HEIGHT); 

Canvas definiert indirekt zwei public static Felder WIDTH und HEIGHT Satz 1 und 2 jeweils

genannt

Eine bessere Lösung wäre Canvas s getPreferredSize Verfahren und gibt die bevorzugte Größe, die Sie ...

Sie verwenden Pack

Display game = new Display(); 
JFrame frame = new JFrame(); 
frame.add(game); 
frame.pack(); 
frame.setTitle(TITLE); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setLocationRelativeTo(null); 
frame.setResizable(false); 
frame.setVisible(true); 

Ein Wort oder eine Warnung gegen die Verwendung von setSize können

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(800, 600); 
} 

Die wollen außer Kraft setzen auf einem Container der obersten Ebene. Ein Fenster enthält normalerweise Rahmendekorationen, die innerhalb der Fenstergrenzen enthalten sind. Wenn Sie setSize verwenden, reduzieren Sie den Inhaltsbereich um die Anzahl der Fensterdekorationen, was zu einer kleineren als erwarteten Größe führt. Stattdessen sollten Sie die Methode getPreferredSize Ihres Hauptcontainers überschreiben und pack aufrufen. Dies ermöglicht es dem Fenster, sich selbst um den Inhalt herum zu "packen", aber Platz für die Rahmendekorationen zu lassen, wobei der von Ihnen angeforderte Platz beibehalten wird.

FrameSetup

Sie können auch einen Blick auf:

Weitere Details

+0

Danke Mann, ich habe einfach nicht darauf geachtet! –

0

Sie einen Tippfehler gemacht haben, wenn die statische Höhe Variable deklarieren, Sie haben es als erklärt „HEIGH“, aber in der JFrame haben Sie das Wort „HÖHE

public static final int HEIGH = 600; 

frame.setSize(WIDTH,HEIGHT); 
verwendet

so die Variable HÖHE ändern und es sollte funktionieren

+0

Danke. Es funktioniert jetzt –