2016-03-19 26 views
0

(私はタイトルにある鉱山に類似している他の2つの質問を見てきましたが、彼らは異なっていて、私の問題への解決策を提供していません。)スレッドが呼び出されたときにJFrameが表示されないのはなぜですか?

こんにちは、

私は以下のコードを持っています線の単純な表示。メインでJFrameを宣言してから、DrawGraph1クラスの新しいインスタンスを呼び出し、JFrameを引数として渡します。 コンストラクタでは、スレッド(EventQueue.invokeLater)を呼び出しています。コンストラクタ)のJFrameを使用して、いくつかの行と列と何を作成するためにそれを使用

(不適切なインデントについては申し訳ありません、それは多くのことを微調整されています)

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); 
        } });}});}} 

だから、私のテストによると、プログラムが到達コンストラクタは、フレームを渡し、スレッドを開始しますが、どうやらそれは、NetBeansデバッガがaddメソッドを下線(か何か)に沿っ

frame.add(new JComponent() 

で停止します。私はまた、メインでスレッドを起動し、JFrameをコンストラクタに渡してジャンプし、同じステートメントで停止するようにしました。

ディスプレイは、単にadd文の前の設定(つまりサイズなどのメイン設定)を持つFrame自体です。

私はそれが昨日働いて以来、非常にばかげた問題であると確信しています、私が変更したものはわかりませんが、私はただ諦めました。

答えて

1

この2行の順序を変更しました。

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

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

へと出力:

Output

+0

ありがとう、それは –

1

は主に、あなたは、のJPanelへのJFrameを可決しました。 JPanelを作成してJFrameに渡す必要があります。

ここに私が主な変更があります。

  1. すべてのSwing GUIの作成は、イベントディスパッチスレッド上になければなりません。これには、JFrameとJPanelが含まれます。メインメソッドにRunnableを追加し、EventQueue invokeLaterメソッドを呼び出して、Event Dispatch ThreadでSwing GUIを開始します。

  2. メインメソッド内のすべてのJFrameコードと、DrawGraph1クラスのpaintComponentメソッド内のすべてのJPanel描画コードを移動しました。 paintComponentメソッドはペイント専用です。その他のクラスやその他の方法で他の処理を行います。

  3. 特定の順序でJFrameメソッドを呼び出す必要があります。あなたのコードで呼び出したのと同じ順序でJFrameメソッドを呼び出します。

  4. あなたのpaintComponentメソッドにsuper.paintComponentの呼び出しを追加しました。これにより、Swingペイントチェーンが維持され、描画パネルがクリアされます。

  5. GUIのサイジングをJFrameからJPanelに移しました。 GUI全体ではなく、描画パネルのサイズに関心があります。

ここに改訂コードがあります。クラスの名前を変更して、テストパッケージ内の他のコードと競合しないようにしました。それを元に戻す必要があります。

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、そこに新しいものがたくさんありました。 –

関連する問題