2017-07-04 1 views
0

Ich habe eine JFrame, die JPanel innen hat. Innerhalb JPanel gibt es 2 Tasten. JPanel hat eine BoxLayout. Ich brauche Knöpfe, die horizontal in der Mitte des Fensters angezeigt werden. Hier ist mein Code:Java Swing BoxLayout Center funktioniert nicht

Ich nur zwei Tasten erstellen, stellen Sie ihre Ausrichtung auf die Mitte (versuchte alle Möglichkeiten, die ich kannte) und fügen Sie sie auf der Platte horizontal.

public class UserInterface extends JFrame { 
    public UserInterface() { 
       setup(); 
    } 
    private void setup() { 
     ... 
     panel=new UserInterfacePanel(); 
     add(panel); 
    } 
} 

class UserInterfacePanel extends JPanel { 
     private JToggleButton startButton; 
     private JToggleButton stopButton; 

     public UserInterfacePanel() { 
      setup(); 
     } 

     private void setup() { 
      setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 

      setupButtons(); 
      setupButtonsActions(); 
      add(startButton); 
      add(stopButton); 
     } 

     private void setupButtons() { 
      ... 
      startButton.setHorizontalAlignment(JButton.CENTER); 
      stopButton.setHorizontalAlignment(JButton.CENTER); 
      startButton.setAlignmentX(CENTER_ALIGNMENT); 
      stopButton.setAlignmentX(CENTER_ALIGNMENT); 
     } 
} 

Und doch funktioniert es nicht. Warum nicht und wie man es repariert?

Antwort

1

Sie setzen die x-Ausrichtung der Schaltflächen, aber Sie sind Box-Layout entlang der x-Achse - macht keinen Sinn. Stellen Sie entweder die Y-Ausrichtung ein und verwenden Sie die X-Achse für die Box-Layout-Richtung, oder legen Sie die X-Ausrichtung fest und verwenden Sie die Y-Achse für die Box-Layout-Richtung.

zB

private void setup() { 
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // **** change **** 

    setupButtons(); 
    // setupButtonsActions(); 
    add(startButton); 
    add(stopButton); 
} 

private void setupButtons() { 
    // ... 
    startButton.setHorizontalAlignment(JButton.CENTER); 
    stopButton.setHorizontalAlignment(JButton.CENTER); 
    startButton.setAlignmentX(CENTER_ALIGNMENT); 
    stopButton.setAlignmentX(CENTER_ALIGNMENT); 
} 

oder

private void setup() { 
    setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 

    setupButtons(); 
    // setupButtonsActions(); 
    add(startButton); 
    add(stopButton); 
} 

private void setupButtons() { 
    // ... 
    startButton.setHorizontalAlignment(JButton.CENTER); 
    stopButton.setHorizontalAlignment(JButton.CENTER); 
    startButton.setAlignmentY(CENTER_ALIGNMENT); // **** change **** 
    stopButton.setAlignmentY(CENTER_ALIGNMENT); // **** change **** 
} 

alle zu zentrieren, verwenden Sie ein anderes Layout, wie ein GridBagLayout:

import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets;  
import javax.swing.*; 

@SuppressWarnings("serial") 
public class UserInterfacePanel extends JPanel { 
    private static final Insets INSETS = new Insets(3, 3, 3, 3); 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 650; 
    private JToggleButton startButton = new JToggleButton("Start"); 
    private JToggleButton stopButton = new JToggleButton("Long Texted Title"); 

    public UserInterfacePanel() { 
     setup(); 
    } 

    private void setup() { 
     setLayout(new GridBagLayout()); // **** change 

     add(startButton, createGbc(0, 0)); 
     add(stopButton, createGbc(1, 0)); 
    } 


    private GridBagConstraints createGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.insets = INSETS; 
     return gbc; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 


    private static void createAndShowGui() { 
     UserInterfacePanel mainPanel = new UserInterfacePanel(); 

     JFrame frame = new JFrame("UserInterfacePanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Es änderte nichts - Tasten sind immer noch auf der linken Seite des Fensters. Sie sind vertikal zentriert, aber nicht horizontal (der zweite Fall Ihres Codes). – parsecer

+0

@parsecer: Sie verwenden das falsche Layout, wenn Sie sie dann zentriert in der Anwendung möchten. Ich würde stattdessen ein GridBagLayout verwenden. –

+0

@parsecer: siehe bearbeiten bitte –

1

Tasten sind nach wie vor in der Lage linke Seite des Fensters.

Wenn Sie die Komponenten Zentrum wollen horizontal auf der Linie, die Sie verwenden müssen „Klebstoff“

add(Box.createHorizontalGlue()); 
add(startButton); 
add(stopButton); 
add(Box.createHorizontalGlue());