2016-08-02 11 views
-2

Ich versuche, den JLabel (Punkt) zu verschieben, um den Speicherort zu verschieben. Es funktioniert nicht und wenn ich frame.setLayout(null) hinzufüge, bekomme ich nur einen leeren dunklen Bildschirm.Der setLocation verschiebt Jlabel nicht, auch wenn ein Layout-Manager deaktiviert ist

JFrame frame = new JFrame("That snake game"); 
     frame.setLayout(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel point = new JLabel("|eat this|"); 
     point.setForeground(Color.blue); 

     frame.getContentPane().add(point); 

     frame.getContentPane().setBackground(new Color(0,3,0)); 
     frame.setSize(400, 400); 

     point.setLocation(340, 34); 

     frame.setVisible(true); 
+3

1) Java GUIs haben auf verschiedenen OS‘, Bildschirmgröße, Bildschirmauflösung arbeiten usw. unterschiedliche PLAFs in verschiedenen Gegenden verwenden. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). 2) BTW - hast du eine * Frage? * –

+0

Entschuldigung, wenn ich unklar war. Meine Frage war, wie man den Jlabel bewegen kann. – qaispak

+0

Wenn Sie beide Links gelesen haben, sollten Sie bereits eine Antwort haben! –

Antwort

-2

Verwenden Sie die setBounds (int x, int y, Breite int, int Höhe). Ich hoffe das hilft! Wenn Sie kein Layout möchten, verwenden Sie einfach nicht die Funktion setLayout. setLayout (null) ist problematisch

+3

Bitte hören Sie auf Java GUIs zu beraten, bis Sie erkennen, wie kontraproduktiv dieser Ratschlag ist. –

+0

Was ist los damit? Der Typ möchte sein JLabel bewegen, setBounds ist der Weg es zu tun – Max

+0

* "setBounds ist der Weg, es zu tun" * Nein, ** ist es nicht. ** Siehe den ersten Kommentar, den ich gemacht habe, oben (auf die Frage). –

-1

Es gibt ein sehr grundlegendes Tutorial here auf das Sie Hinweise geben könnten.

Mindestens müssen Sie

  • der Layout-Set-Manager des Containers auf null: setLayout (null).
  • Rufen Sie die setbounds-Methode der Component-Klasse für jede untergeordnete Komponente auf
  • Rufen Sie die Repaint-Methode der Component-Klasse auf.
  • verwalten Mausereignisse Komponenten (ändern Komponenten Grenzen)

Ihre Probleme sein kann, sich zu bewegen, dass Sie die repaint verpasst, und setBounds für Label?

Allerdings, wie von Andrew gesagt, Swing ist schwierig und dieses Thema Swing-Layout ist komplex, so dass dies möglicherweise nicht der Weg zu gehen.

Vielleicht sollten Sie einige Teile Ihres Spiels so umgestalten, dass der Grafikteil nicht zu sehr mit GUI-Elementen interferiert. Zum Beispiel - nur eine Idee - alle Ihre Grafikinteraktion in einer benutzerdefinierten gemalten und vollständig verwalteten Komponente zu beschränken? einschließlich der Malerei eines bewegten Textes, wenn dies ein Teil des Spiels ist so yo uwill bewegt sich nicht JLabel und stören den Layout-Teil. (nur eine Idee)

0

Ich sehe, dass Sie ein Snake-Spiel erstellen möchten. Sie verwenden die falsche API. Verwenden Sie dazu die Mal-API des Swing. Hier ist ein Snake-Spiel, das ich erstellt habe: Snake game tutorial. JLabel und andere Komponenten werden verwendet, um die Benutzeroberfläche einer typischen Desktop-Anwendung zu erstellen; Sie werden nicht zum Erstellen von Spielen verwendet.

Jetzt für, warum Ihr Beispiel nicht funktionierte: Sie müssen auch Größe des JLabel einstellen. Wenn Sie also setLocation() verwenden, sollten Sie auch setSize() verwenden oder einen setBounds() Anruf verwenden.

package com.zetcode; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

/** 
* Demonstrating setLocation method 
* @Author Jan Bodnar 
* Website zetcode.com 
*/ 

public class SetLocationEx extends JFrame { 

    public SetLocationEx() { 

     initUI(); 
    } 

    private void initUI() { 

     setLayout(null); 

     JLabel lbl1 = new JLabel("JLabel"); 
     lbl1.setBorder(BorderFactory.createEtchedBorder()); 
     lbl1.setSize(80, 30); 
     lbl1.setLocation(50, 100); 

     add(lbl1); 

     setSize(350, 300); 
     setTitle("SetLocation example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      SetLocationEx ex = new SetLocationEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

Screenshot:

Screenshot of the example

Verwandte Themen