2017-10-29 3 views
0

Ich habe eine Zuordnung, und die Anweisungen angeben, dass ich zwei Beschriftungen auf dem Bildschirm (horizontal und vertikal) zentriert werden müssen.
Ich weiß, dass diese Frage schon oft gestellt wurde, aber wenn ich nach dieser Frage gesucht habe, ist die Lösung oft, einen anderen Layout-Manager zu verwenden, wie BoxLayout. Die Anweisungen geben jedoch auch an, dass ich BorderLayout verwenden muss.
Ursprünglich habe ich die Beschriftungen nicht zu einem Panel hinzugefügt und stattdessen direkt in den Rahmen eingefügt, aber das hat nicht funktioniert, daher wurde mir geraten, beide auf eine JPanel zu setzen, was auch nicht funktioniert hat.Java Swing - Center ein JLabel mit BorderLayout

Mein Code sieht wie folgt zur Zeit:

JButton butSubmit = new JButton("Submit"); 
    JButton butReset = new JButton("Reset"); 

    JLabel nameAndReg = new JLabel("My details", SwingConstants.CENTER); 
    JLabel errorMsg = new JLabel("The error message", SwingConstants.CENTER); 
    nameAndReg.setForeground(Color.blue); 

    JTextField redVal = new JTextField(3); 
    JTextField greenVal = new JTextField(3); 
    JTextField blueVal = new JTextField(3); 

    JPanel butPanelSouth = new JPanel(); 
    JPanel butPanelNorth = new JPanel(); 
    JPanel labsPanel = new JPanel(); 

    butPanelSouth.add(redVal); 
    butPanelSouth.add(greenVal); 
    butPanelSouth.add(blueVal); 
    butPanelSouth.add(butSubmit); 
    butPanelNorth.add(butReset); 
    labsPanel.add(nameAndReg, BorderLayout.CENTER); 
    labsPanel.add(errorMsg, BorderLayout.CENTER); 

    add(labsPanel, BorderLayout.CENTER); 
    add(butPanelNorth, BorderLayout.NORTH); 
    add(butPanelSouth, BorderLayout.SOUTH); 

Und das ist, was sie produziert: Current result
Wie kann ich ‚Meine Details‘ und ‚Die Fehlermeldung‘ sein vertikal und horizontal erhalten in die Mitte des Fensters, eine unter der anderen, und immer noch BorderLayout?

Edit: Sorry, ich merke, dass ich nicht sehr klar war. Der Ratschlag, den ich erhielt, war: "Verschachteln Sie vielleicht Ihre Layout-Manager, also legen Sie ein JPanel in die Mitte eines BorderLayouts auf einem JFrame."

+0

Nehmen Sie an, dass Ihr JLabel wegen des Textes nicht in der Mitte ist? Sie können die Hintergrundfarbe Ihres JLabel ändern und sehen, wo sich das gesamte JLabel zuerst befindet. Es könnte bereits in der Mitte sein, wenn Sie bereits alle Ansätze ausprobiert haben. – user3437460

+1

Alle Ihre Panels ** müssen ** BorderLayout verwenden (es wäre verrückt ...), oder Sie können verschachtelte Panels mit verschiedenen 'LayoutManagern' verwenden?Jetzt verwenden Sie 'FlowLayout' für Ihre Sub-Panels (wenn Sie kein Layout an den 'JPanel'-Konstruktor übergeben, wird' FlowLayout' verwendet) – Ansharja

+0

Eigentlich, jetzt, wo ich neu lese, was mir geraten wurde, es zu tun sagt 'vielleicht schachteln Sie Ihre Layout-Manager, dh legen Sie ein JPanel in die Mitte eines BorderLayout auf einem JFrame.' – electricbl00

Antwort

1

Wie ich im Kommentar oben gesagt habe, sollten Sie klarstellen, was Sie meinen, wenn Sie sagen "die Anweisungen geben auch an, dass ich BorderLayout verwenden muss".

Wenn Sie meinen, dass Ihr Inhaltsbereich eine BorderLayout haben muss und die anderen Bereiche ein anderes Layout haben können (wie in Ihrem Code, da Sie in Ihren Unterbereichen einen FlowLayout verwenden), können Sie Ihr Problem einfach lösen.

Sie müssen nur Ihre Etiketten in einer JPanel hinzufügen, die ein Layout verwendet, das die Etiketten in der Mitte ausrichtet, wie GridBagLayout tut. Ihr erstes Etikett wird gridx = 0 und gridy = 0 haben, das zweite Etikett wird gridx = 0 und gridy = 1 haben. Ihre zweite wird genau unter der ersten sein, Sie können insets verwenden, um etwas leeren Platz zu schaffen (im folgenden Code verwende ich 5 Pixel für Insets.top).

Da Ihr labsPanel bei BorderLayout.CENTER sein wird, nimmt das Panel alle leeren Raum in Ihrem Rahmen und GridBagConstrains.anchor Standardwert (GridBagConstrains.CENTER) stellt sicher, dass Ihre Etiketten in Ihrem labsPanel zentriert sind. Als Ergebnis werden die Etiketten vertikal und horizontal in der Mitte des Rahmens ausgerichtet ist, wie in der screeenshot unter:

enter image description here

Codebeispiel:

import java.awt.*; 
import javax.swing.*; 
public class Test 
{ 
    public static void main (String [] a) { 
     SwingUtilities.invokeLater (new Runnable() { 
      @Override public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
    private static void createAndShowGUI() { 
     JFrame frame = new JFrame ("Test"); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane (new MainPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo (null); 
     frame.setVisible (true); 
    } 
} 
class MainPanel extends JPanel 
{ 
    public MainPanel() { 
     super (new BorderLayout()); 

     JLabel nameAndReg = new JLabel ("My details", SwingConstants.CENTER); 
     JLabel errorMsg = new JLabel ("The error message", SwingConstants.CENTER); 
     nameAndReg.setForeground(Color.blue); 

     JPanel labsPanel = new JPanel (new GridBagLayout()); 

     labsPanel.add (nameAndReg); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.gridy = 1; 
     c.insets = new Insets (5, 0, 0, 0); 
     labsPanel.add (errorMsg, c); 

     JButton butSubmit = new JButton("Submit"); 
     JButton butReset = new JButton("Reset"); 

     JTextField redVal = new JTextField(3); 
     JTextField greenVal = new JTextField(3); 
     JTextField blueVal = new JTextField(3); 

     JPanel butPanelSouth = new JPanel(); 
     JPanel butPanelNorth = new JPanel(); 

     butPanelSouth.add (redVal); 
     butPanelSouth.add (greenVal); 
     butPanelSouth.add (blueVal); 
     butPanelSouth.add (butSubmit); 

     butPanelNorth.add (butReset); 

     add (labsPanel, BorderLayout.CENTER); 
     add (butPanelNorth, BorderLayout.NORTH); 
     add (butPanelSouth, BorderLayout.SOUTH); 
    } 
} 

Wenn alle Panels muss eine BorderLayout haben, es ist sehr schwer zu erreichen, was Sie wollen, aber wie gesagt, es wäre eine verrückte Voraussetzung.