2016-03-25 7 views
1

Ich habe einen Rahmen, in diesem Rahmen habe ich ein Panel mit Box-Layout, in diesem Panel habe ich 4 weitere Panels.benutzerdefinierten Ort für eine Komponente in Box Layout

 mainFrame = new JFrame("Basket Game"); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     mainPanel.add(options); 
     mainPanel.add(pname); 
     mainPanel.add(info); 
     mainPanel.add(gamearea);  

    mainFrame.setContentPane(mainPanel); 
    mainFrame.pack(); 
    mainFrame.getContentPane().setBackground(Color.LIGHT_GRAY); 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(600,600); 

Das Formular sieht wie folgt aus:

form

Die erste 3-Panel für mich in Ordnung ist. Aber für das letzte Panel (schwarz) möchte ich einige Komponenten mit benutzerdefinierten Koordinaten hinzufügen. Aber wenn ich versuche, sie mit eigenen hinzuzufügen Koordinaten:

basket.setLocation(500, 500); 
gamearea.add(basket); 

Es geht direkt oben in der Mitte der Platte (Koordinaten hat keinen Einfluss auf die Lage)

second

Als ich eingestellt gameareI s Layout zu null Ich kann mein Etikett auf dem Panel nicht sehen. Ich denke, ich sollte etwas extra dafür machen. Wie kann ich das machen?

+0

Ihr Hauptfenster ist nur 600x600. Mit Titelleiste, Optionen, Spielername und Info befindet sich y = 500 wahrscheinlich unter dem unteren Rand des Bereichs. – AJNeufeld

+0

Verstehen Sie, wie ein Layout-Manager funktioniert? Verstehst du die Verantwortung, die der Layout-Manager hat? Verstehst du, wer das Zurücksetzen der API mit dem Layout-Manager interagiert? Wenn Sie dies nicht tun, ist ein Null-Layout nicht die richtige Wahl. In fast allen Fällen, wenn Sie denken, dass Sie ein Null-Layout wollen, tun Sie das wahrscheinlich nicht. In diesen seltenen Fällen könnte ein Null-Layout nützlich sein, ein benutzerdefiniertes Layout würde zu weit weniger Problemen und Nacharbeit führen. – MadProgrammer

Antwort

1

Das Problem ist nicht mit Ihrem Layout-Manager (null), noch mit etwas ausgelassen werden. Das Problem ist einfach 500x500 ist außerhalb der Grenzen von game area.

public class NullLayout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(NullLayout::new); 
    } 

    NullLayout() { 
     JFrame frame = new JFrame("Basket Game"); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 4; i++) { 
      JPanel strip = new JPanel(); 
      strip.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50)); 
      strip.setBorder(BorderFactory.createTitledBorder("Strip " + i)); 
      strip.add(new JLabel("Strip " + i)); 
      mainPanel.add(strip); 
     } 

     JPanel gamearea = new JPanel(); 
     gamearea.setLayout(null); 
     mainPanel.add(gamearea); 

     for (int i = 0; i < 5; i++) { 
      int x = i * 100, y = i * 100; 
      JPanel basket = new JPanel(); 
      basket.setSize(200, 50); 
      basket.setLocation(x, y); 
      basket.setBackground(Color.YELLOW); 
      basket.add(new JLabel("x = " + x + ", y = " + y)); 
      gamearea.add(basket); 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setSize(600, 600); 

     frame.setVisible(true); 
    } 
} 

Basket showing (0,0), to (300,300), but not (400,400)

Beachten Sie, dass die Basket bei 400.400 nicht angezeigt wird; es wäre vom unteren Rand des Spielbereichs entfernt.

0

Es ist fast immer falsch, ein Null-Layout zu verwenden. Sie sollten einen LayoutManager verwenden, der hilft, die Komponenten dort zu platzieren, wo Sie sie haben möchten - besonders nützlich, wenn der Benutzer die Größe des Hauptrahmens ändert. Verwenden Sie ein GridBag- oder Mig-Layout.

Wenn Sie absolut darauf bestehen, ein Null-Layout zu verwenden, erstellen Sie eine neue GameArea-Klasse, die JPanel erweitert, überschreibt ihre paintComponent() -Methode und legt die untergeordneten Positionen mit child.setBounds (...) fest. Stellen Sie sicher, dass die erste Anweisung in der überschriebenen Methode super.paintComponent(g); ist.

+0

Ein 'Null'-Layout ist definitiv erlaubt. Siehe https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html – AJNeufeld

+0

Zusätzlich kann der Benutzer die Größe des Fensters nicht ändern, da 'mainFrame.setResizable (false);' aufgerufen wurde . – AJNeufeld

+0

@AJNeufeld könnte es "erlaubt" sein, aber es ist sehr davon abgeraten und jedes Mal, wenn Sie denken, dass Sie es brauchen, werden Sie wahrscheinlich nicht. Die gesamte Swing-API wird um die Layout-API herum geschrieben, und das Verwerfen wirft eine enorme Menge an Verantwortung auf den Entwickler zurück, die meisten sind nicht bereit, damit umzugehen. – MadProgrammer

Verwandte Themen