2016-04-22 8 views
-1

Ich versuche ein JPanel zu einem anderen JPanel hinzuzufügen und es an einem bestimmten Ort auf der ersten JPanel platzieren. Ich mache das mit setBounds(x, y, w, h). Jetzt weiß ich, dass ich das nicht tun sollte, aber ich brauche eine Möglichkeit, es zu bewegen (als Animation).JPanel setbounds

Das Problem, das ich habe, ist, dass das Y nicht funktioniert. Wenn ich getBounds() mache, wird es auf den korrekten Wert eingestellt, aber es bewegt sich nicht auf dem Bildschirm. Ich habe die Layout auf null festgelegt.

Erste JPanel:

public WarehousePanel() 
{ 
    super(null); 

    gantries = new Gantry[5]; 

    for (int i = 0; i < gantries.length; i++) 
    { 
     gantries[i] = new Gantry(3); 
     add(gantries[i]); 
     System.out.println(gantries[i].getY()); 
     gantries[i].setBounds(15 * (i + 1), 100, 10, 50); 
     System.out.println(gantries[i].getBounds()); 
    } 
}' 

Zweite JPanel:

public Gantry(int y) 
{ 
    this.y = y; 

    packageY = new ArrayList(); 

    setBackground(Color.red); 
    setPreferredSize(new Dimension(10, 50)); 
} 

Vielen Dank im Voraus.

+0

'Portale [i] .setBounds (15 * (i + 1), 100, 10, 50);' Y ändert sich nicht. – Tin

+0

Korrekt, Y auf dem Bildschirm scheint immer noch 5 zu sein. – javaNoobsForever

+0

Ich meinte, ich sehe nicht, dass Sie Y-Koordinate bewegen. Wenn Sie Animationen sehen möchten, müssen Sie möglicherweise eine Verzögerung wie Thread.sleep (Millisekunden) hinzufügen. Wenn Sie keine Verzögerung hinzufügen, wird nur der letzte Wert angezeigt - innerhalb von Schleifen werden keine Werte angezeigt. Ihr Bildschirm hat nur jframe nach der Schleife gerendert. – Tin

Antwort

0

vielleicht mit einer undekorierten JInternalFrame? das wird tun, was Sie wollen, mit viel weniger Aufwand zu tun. Außerdem ist es generell eine schlechte Idee, setBounds anstelle eines Layout-Managers zu verwenden.

Wenn Sie absolut positiv sind entschlossen, die Dinge auf diese Weise zu tun, dann sind Sie sicher, dass Sie die Repaint-Methode der Komponente Klasse as per spec aufrufen?

Schließlich sind Sie sicher, dass die Größe des übergeordneten JPanel groß genug ist, um den Aufruf setBounds für die untergeordnete Komponente aufzunehmen?

0

Correct, Y auf dem Bildschirm erscheint noch 5.

Das sagt mir, Sie noch zu sein sind die Standard-Flowlayout für das Panel.

Wenn ich getBounds() bekomme, wird es auf den richtigen Wert gesetzt, rk.

ja, aber Sie zeigen den Wert direkt nach der Zuweisung des Wertes an. Das wird dir nichts sagen. Sie müssen die Grenzen anzeigen, NACHDEM der Rahmen sichtbar ist. Wenn Sie den Frame sichtbar machen, wird der Layout-Manager aufgerufen.

Überprüfen Sie also, ob Sie ein Null-Layout verwenden.

Wenn das nicht hilft dann posten Sie Ihre SSCCE, die das Problem demonstriert. Erstellen Sie einen JFrame und setzen Sie das Layout auf null. Erstellen Sie dann ein JPanel, legen Sie seine Grenzen und den Hintergrund fest und fügen Sie das Panel zum Rahmen hinzu. Beweisen Sie selbst, dass der grundlegende Code funktioniert. Bestimmen Sie dann, was sich vom Arbeitscode und Ihrem Code unterscheidet.