2016-12-09 3 views
1

5つのオブジェクトをインスタンス化し、ArrayListに追加するメソッドを呼び出します。 ArrayListのサイズを印刷する別のメソッドを呼び出すと、サイズが5であることが表示されます。JPanelを作成してJFrameに追加してのサイズをpaintComponentから印刷しようとしたときに、paintComponentが呼び出されます。サイズは0です。System.out.printlnの順番を見ると、にオブジェクトを作成して追加した後にpaintComponentが呼び出されています。 ArrayListが空白として表示されるのはなぜですか?PaintComponentが呼び出されたときに配列のサイズが0になる

(ショート検証例では、この私の第二の試み)

予想される出力:

サイズ、PRINTINFO:5
サイズ、PRINTINFO:5
サイズ、paintComponent:5
サイズ、paintComponent :5

実際の出力

サイズ、PRINTINFO:5
サイズ、PRINTINFO:5
サイズ、paintComponent:0
サイズ、paintComponent:0

アイテム:

public class Item{ 
//Empty 
} 

パネル:

import java.awt.Graphics; 
import java.util.ArrayList; 

import javax.swing.JPanel; 

public class Panel extends JPanel{ 
    ArrayList<Item> stuff = new ArrayList<Item>(); 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     System.out.println("Size, paintComponent: " + stuff.size()); 
    } 

    public void setUpPanel(){ 
     for (int i = 0; i<5; i++) 
      stuff.add(new Item()); 
    } 

    public void printInfo(){ 
     System.out.println("Size, printInfo: " + stuff.size()); 
    } 
} 

フレーム:

import javax.swing.JFrame; 

public class Frame extends JFrame{ 
    public static void main (String args[]){ 
     Panel j = new Panel(); 
     j.setUpPanel(); 
     j.printInfo(); 
     Frame frame = new Frame(); 
     j.printInfo(); 
    } 

    public Frame(){ 
     super("Test"); 
     add(new Panel()); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(800,600); 
     setLocationRelativeTo(null); 
    } 
} 
+1

クラス 'フレーム'をクラス化しないでください。その名前のAWTクラスがあります。混乱を避けるために、あなたのクラス名をより分かりやすくしてください。 – camickr

+0

ポインタありがとう。私の実際のプログラムでは、彼らは実名を持っています。 – ulw1

+1

あなたがここに投稿するコードは、あなたがしていることを正確に知るために、 'MCVE'の形で実際のコードでなければなりません。これはすでにあなたの最後の質問であなたに言及されています:http://stackoverflow.com/questions/40815724/pack-method-called-from-actionperformed-functions-only-sometimesとその前の質問:http:// stackoverflow .com/questions/40794576/how-to-force-jpanels-using-gridbaglayoutからjframeへのリサイズ – camickr

答えて

3

このラインがあります。

add(new Panel()); 

をそのリストが空で明らかになるよう、そのsetUpPanel()が呼び出されたことのないPanelを追加します。あなたはおそらくあなたの他のPanel渡したい

:他の既存のクラスの名前を使用することをお勧めされていないことを

import javax.swing.JFrame; 

public class Frame extends JFrame{ 
    public static void main (String args[]){ 
     Panel j = new Panel(); 
     j.setUpPanel(); 
     j.printInfo(); 
     Frame frame = new Frame(j); 
     j.printInfo(); 
    } 

    public Frame(Panel panel){ 
     super("Test"); 
     add(panel); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(800,600); 
     setLocationRelativeTo(null); 
    } 
} 

注意、これはjava.awt.Panelとインスタンスのjava.awt.Frameとの誤解を招く恐れがあります。

+1

説明と解決策!本当にありがとう。それはそんなに愚かな間違いです。 – ulw1

3

Panelという2つのインスタンスで作業しています。

public static void main (String args[]){ 
    Panel j = new Panel(); // <-- here 
    j.setUpPanel(); 
    j.printInfo(); 
    Frame frame = new Frame(); 
    j.printInfo(); 
} 

Frameコンストラクタの第二:最初は、あなたの主な方法で作成され

public Frame(){ 
    super("Test"); 
    add(new Panel()); // <-- here 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(800,600); 
    setLocationRelativeTo(null); 
} 

これらの各インスタンスは、リストの独自のインスタンスを保持しています。あなただけのリストのいずれかを移入するので、他のはまだサイズ0

関連する問題