简体   繁体   中英

BoxLayout Left Alignment

I'm trying to left align the class and neutral buttons so they are in line with the left most card button. For some reason, setAlignmentX only shifts the buttons half way. Here is the code. Is there away to align the buttons?

private String[] listEntries = {"a","a","a","a","a"};
private JButton remove = new JButton("Remove");
private JList list;
private JButton b1 = new JButton("Class");
private JButton b2 = new JButton("Neutral");
private JPanel page = new JPanel(new CardLayout());
private DefaultListModel listModel = new DefaultListModel();

public Main () {

    JPanel leftPanel = new JPanel();
    JPanel rightPanel = new JPanel();
    rightPanel.setLayout(new BoxLayout(rightPanel,BoxLayout.PAGE_AXIS));
    leftPanel.setLayout(new BoxLayout(leftPanel,BoxLayout.PAGE_AXIS));
    rightPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
    leftPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    JLabel title  = new JLabel("Deck Constructor", SwingConstants.CENTER);
    title.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));

    //Set up Deck List 
    list = new JList(listModel);
    list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    list.setLayoutOrientation(JList.VERTICAL);
    list.setVisibleRowCount(-1);

    JScrollPane listScroller = new JScrollPane(list);
    listScroller.setPreferredSize(new Dimension(150, 80));

    JLabel listTitle = new JLabel("List");
    listTitle.setLabelFor(list);
    listScroller.setAlignmentX(LEFT_ALIGNMENT);


    rightPanel.add(listTitle);
    rightPanel.add(listScroller);
    rightPanel.add(remove);

    //Set up Card Selection
    JPanel buttonPanel = new JPanel();
    buttonPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);

    b1.setActionCommand("Class");
    b2.setActionCommand("Neutral");
    b1.addActionListener(this);
    b2.addActionListener(this);
    buttonPanel.add(b1);
    buttonPanel.add(b2);

    JPanel classCards = new JPanel(new GridLayout(2,3, 10, 10));
    JButton card1 = new JButton("Card 1");
    card1.addActionListener(this);
    card1.setActionCommand("addCard");
    JButton card2 = new JButton("Card 2");
    JButton card3 = new JButton("Card 3");
    JButton card4 = new JButton("Card 4");
    JButton card5 = new JButton("Card 5");
    JButton card6 = new JButton("Card 6");
    classCards.add(card1);
    classCards.add(card2);
    classCards.add(card3);
    classCards.add(card4);
    classCards.add(card5);
    classCards.add(card6);


    JPanel neutral = new JPanel();
    neutral.setBackground(Color.BLUE);
    page.add(classCards, "Class");
    page.add(neutral, "Neutral");

    leftPanel.add(buttonPanel);
    leftPanel.add(page);


    setPreferredSize(new Dimension(640,640/12*9));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    getContentPane().add(leftPanel,BorderLayout.CENTER);
    getContentPane().add(rightPanel,BorderLayout.EAST);
    getContentPane().add(title,BorderLayout.NORTH);
    pack();
    setVisible(true);
}

It is not perfect solution, but you can use for example:

  1. If you want to keep buttons default size:

     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEADING,1,2)); 

    and delete:

     buttonPanel.setAlignmentX(Component.RIGHT_ALIGNMENT); 
  2. If you want to fill buttonPanel with buttons:

     JPanel buttonPanel = new JPanel(new GridLayout(1,2,2,2)); buttonPanel.setBorder(new EmptyBorder(2,1,2,1)); 

In (FlowLayout.LEADING,1,2) and in EmptyBorder(2,1,2,1)) the 1,2 values are added to match buttonPanel and classCard hgap and vgap.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM