2016-12-09 1 views
1

Ich rufe eine Methode, die 5 Objekte instanziiert und fügt sie zu einem ArrayList hinzu. Wenn ich eine andere Methode anrufe, um die Größe des ArrayList auszudrucken, zeigt es an, dass die Größe 5 ist. Wenn paintComponent genannt wird, nachdem ich JPanel einen erzeuge, und versuche, die Größe des ArrayList von paintComponent zu drucken, zeigt es das Größe als 0. Blick auf die Reihenfolge System.out.println 's ich weiß paintComponent wird aufgerufen, nachdem ich Objekte zu ArrayList erstellen und hinzufügen. Warum wird ArrayList als leer angezeigt?Größe eines Arrays wird 0, wenn PaintComponent aufgerufen wird

(Dies ist mein zweiter Versuch in einem kurzen nachprüfbaren Beispiel)

Erwartete Ausgabe:

Größe, printInfo: 5
Größe, printInfo: 5
Größe, paintcomponent: 5
Größe, paintcomponent : 5

Tatsächliche Ausgabe

Größe, printInfo: 5
Größe, printInfo: 5
Größe, paintcomponent: 0
Größe, paintcomponent: 0

Item:

public class Item{ 
//Empty 
} 

Panel:

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

Rahmen:

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

Klassifizieren Sie Ihre Klasse 'Frame' nicht. Es gibt eine AWT-Klasse mit diesem Namen. Machen Sie Ihren Klassennamen beschreibender, um Verwirrung zu vermeiden. – camickr

+0

Danke für den Zeiger. In meinem eigentlichen Programm haben sie echte Namen, das habe ich nur zum Beispiel gemacht. – ulw1

+1

Der Code, den Sie hier posten, sollte echter Code in Form eines 'MCVE' sein, damit wir genau wissen, was Sie tun. Dies wurde bereits in Ihrer letzten Frage erwähnt: http://stackoverflow.com/questions/40815724/pack-method-called-from-actionperformed-functions-only-omestimes und die Frage davor: http: // stackoverflow .com/fragen/40794576/how-to-force-jpanels-mit-gridbaglayout-to-resize-with-jframe – camickr

Antwort

3

diese Zeile:

add(new Panel()); 

ein Panel fügt hinzu, dass seine setUpPanel() genannt nie gehabt hat, so offensichtlich die Liste leer ist.

Sie wollten wahrscheinlich die anderen Panel weitergeben müssen:

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

Beachten Sie, dass es nicht ratsam ist, Namen von anderen bestehenden Klassen zu verwenden, wird dies mit java.awt.Panel und java.awt.Frame zum Beispiel irreführend.

+1

Eine Erklärung und eine Lösung! Vielen Dank. Das ist so ein dummer Fehler. – ulw1

3

Sie arbeiten mit zwei Instanzen von Panel. Die erste ist in Ihrer Haupt-Methode erstellt:

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

Die zweite im Frame Konstruktor:

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

Jede dieser Instanzen hält eine eigene Instanz der Liste. Da Sie nur eine der Listen zu füllen, haben die andere immer noch die Größe 0.

Verwandte Themen