2016-03-19 4 views
0

(Ich habe die anderen 2 Fragen gesehen, die Mine in Titel ähnlich sind, aber sie sind unterschiedlich und bieten keine Lösung für mein Problem.)Warum kann JFrame nicht angezeigt werden, wenn der Thread aufgerufen wird?

Hallo,

ich den Code unten haben, einfache Darstellung von Linien. Ich deklariere hauptsächlich einen JFrame und rufe dann eine neue Instanz der DrawGraph1-Klasse auf und übergebe den JFrame als Argument. Im Konstruktor rufe ich einen Thread (EventQueue.invokeLater) auf. Der Konstruktor verwenden, um die JFrame und verwenden Sie es ein paar Zeilen und String und was auch immer)

(Tut mir leid, falsche Vertiefung zu schaffen, hat es viel)

package test; 
import java.awt.*; 
import java.awt.geom.*; 
import java.text.DateFormatSymbols; 
import javax.swing.*; 

public class test { 
    public static void main(String[] args){     
     final JFrame frame = new JFrame(); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 700); 
     frame.setVisible(true); 
     DrawGraph1 obj = new DrawGraph1(frame); 
} 
} 
class DrawGraph1{   
    DrawGraph1(final JFrame frame){ 
     EventQueue.invokeLater(new Runnable(){    
     @Override    
     public void run(){     
     frame.setTitle("LineDrawing");  
     frame.add(new JComponent() 
      { 
       @Override 
       public void paintComponent(Graphics g) 
       { 
        Graphics2D g2 = (Graphics2D) g; 
        Line2D line = new Line2D.Double(); 
        int decrement = 0, label = 0;     

        g2.setColor(Color.red);   
        g.drawString("Red Line ->> High temperatures", 330, 110); 
        g2.setColor(Color.green);   
        g.drawString("Green Line ->> Low temperatures", 330, 130); 
        } });}});}} 

So Nach meinen Tests, erreicht das Programm gezwickt worden der Konstruktor, übergibt den Rahmen, und startet den Faden, aber anscheinend hält er an der Linie

frame.add(new JComponent() 

Mit dem NetBeans-Debugger unterstreichen (oder etwas) die Add-Methode. Ich habe auch versucht, in dem ich den Thread im Haupt aufrufen, übergebe den JFrame an den Konstruktor, spring zu ihm und es stoppt auch bei der gleichen Aussage.

Die Anzeige ist einfach der Rahmen selbst mit den Einstellungen vor der Anweisung add (d. H. In den Haupteinstellungen wie Größe).

Ich bin mir ziemlich sicher, dass es sehr albern Problem ist, da es gestern funktionierte, nicht sicher, was ich änderte, aber ich gab einfach auf.

Antwort

1

Ich habe gerade die Reihenfolge dieser beiden Zeilen geändert.

frame.setVisible(true); 
DrawGraph1 obj = new DrawGraph1(frame); 

zu

DrawGraph1 obj = new DrawGraph1(frame); 
frame.setVisible(true); 

und die Ausgabe:

Output

+0

Danke, es hat funktioniert –

1

In erster Linie übergeben Sie die JFrame auf die JPanel. Sie sollten JPanel erstellen und es an den JFrame übergeben.

Hier sind die wichtigsten Änderungen, die ich vorgenommen habe.

  1. Alle Swing-GUI-Erstellung muss auf dem Event Dispatch Thread sein. Dazu gehören der JFrame und der JPanel. Ich habe der main-Methode ein Runnable hinzugefügt und die inquokeLater-Methode EventQueue aufgerufen, um die Swing-GUI für den Event-Dispatch-Thread zu starten.

  2. Ich habe den JFrame-Code in der Hauptmethode und den gesamten JPanel-Zeichencode in der paintComponent-Methode DrawGraph1 verschoben. Die Methode paintComponent dient nur zum Malen. Mach deine anderen Bearbeitungen in anderen Klassen und/oder anderen Methoden.

  3. Die JFrame-Methoden müssen in einer bestimmten Reihenfolge aufgerufen werden. Rufen Sie die JFrame-Methoden in derselben Reihenfolge auf, in der Sie sie in Ihrem Code aufgerufen haben.

  4. Ich habe der Methode paintComponent einen Aufruf von super.paintComponent hinzugefügt. Dadurch wird die Swing-Farbkette beibehalten und das Zeichenfeld gelöscht.

  5. Ich habe die Größe der GUI von der JFrame auf die JPanel verschoben. Sie haben mit der Größe des Zeichenbereichs und nicht mit der gesamten Benutzeroberfläche zu tun.

Hier ist der überarbeitete Code. Ich habe die Klasse umbenannt, damit sie nicht mit anderem Code in meinem Testpaket in Konflikt gerät. Sie sollten es zurück ändern.

package com.ggl.testing; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class SimpleJPanelTest { 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       final JFrame frame = new JFrame("Line Drawing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       frame.add(new DrawGraph1()); 
       frame.pack(); 
       frame.setLocationByPlatform(true); 
       frame.setVisible(true); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 

class DrawGraph1 extends JPanel { 

    private static final long serialVersionUID = 6733473371292195071L; 

    public DrawGraph1() { 
     setPreferredSize(new Dimension(800, 700)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D) g; 
     Line2D line = new Line2D.Double(); 
     int decrement = 0, label = 0; 

     g2.setColor(Color.red); 
     g.drawString("Red Line ->> High temperatures", 330, 110); 
     g2.setColor(Color.green); 
     g.drawString("Green Line ->> Low temperatures", 330, 130); 
    } 

} 
+0

Thx, viele neue Sachen drin. –

Verwandte Themen