在JPanel中将按钮居中对齐

3

我该如何将按钮(S、S、D和D以及A、U、D和d)对齐到面板(蓝色和红色)的中心?面板可以增长(高度而非宽度),但按钮应保持在中央并保持相同的大小。因此,GridLayout不适用。



    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;

    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;

    import javax.swing.JButton;
    import java.awt.BorderLayout;
    import java.awt.Color;


    public class TestFrame extends JFrame {
        /**
         * 
         */
        private static final long serialVersionUID = 5671798241966272024L;

        public TestFrame() {

            FlowLayout layout = new FlowLayout();

            JButton moveUpButton = new JButton("U");
            JButton moveAllUpButton = new JButton("A");

            JButton moveDownButton = new JButton("D");
            JButton moveAllDownButton = new JButton("D");

            JButton selectButton = new JButton("S");
            JButton selectAllButton = new JButton("S");

            JButton deselectButton = new JButton("D");
            JButton deselectAllButton = new JButton("D");


            setSize(600, 400);

            getContentPane().setLayout(new GridLayout());


            JPanel selectButtonsPanel = new JPanel();
            selectButtonsPanel.setBackground(Color.BLUE);

            selectButtonsPanel.setLayout(layout);
            selectButtonsPanel.setPreferredSize(new Dimension(50, 0));
            selectButtonsPanel.add(selectAllButton);
            selectButtonsPanel.add(selectButton);
            selectButtonsPanel.add(deselectButton);
            selectButtonsPanel.add(deselectAllButton);

            JPanel moveButtonsPanel = new JPanel(layout);
            moveButtonsPanel.setBackground(Color.RED);
            moveButtonsPanel.setLayout(layout);
            moveButtonsPanel.setPreferredSize(new Dimension(50, 0));
            moveButtonsPanel.add(moveAllUpButton);
            moveButtonsPanel.add(moveUpButton);
            moveButtonsPanel.add(moveDownButton);
            moveButtonsPanel.add(moveAllDownButton);


            JPanel sourcePanel = new JPanel ();
            sourcePanel.setLayout(new BorderLayout());
            sourcePanel.add(new JTable(), BorderLayout.CENTER);
            sourcePanel.add(selectButtonsPanel, BorderLayout.EAST);


            JPanel destinationPanel = new JPanel ();
            destinationPanel.setLayout(new BorderLayout());
            destinationPanel.add(new JTable(), BorderLayout.CENTER);
            destinationPanel.add(moveButtonsPanel, BorderLayout.EAST);


            getContentPane().add (sourcePanel);
            getContentPane().add(destinationPanel);


        }

    }


你的当前代码有什么问题? - Hovercraft Full Of Eels
按钮顶部对齐。 - user2199160
1个回答

4

考虑嵌套使用不同的布局方式来创建JPanel。BoxLayout可以让你居中显示内部的JPanel,该面板包含了JButtons。内部面板使用GridLayout,而外部面板则使用BoxLayout,并在顶部和底部添加了glue。

    JPanel innerSelectPanel = new JPanel(new GridLayout(0, 1, 0, 5));
    // innerSelectPanel.setPreferredSize(new Dimension(50, 0));
    innerSelectPanel.add(selectAllButton);
    innerSelectPanel.add(selectButton);
    innerSelectPanel.add(deselectButton);
    innerSelectPanel.add(deselectAllButton);
    innerSelectPanel.setOpaque(false);
    innerSelectPanel.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2));
    selectButtonsPanel.setLayout(new BoxLayout(selectButtonsPanel, BoxLayout.PAGE_AXIS));
    selectButtonsPanel.add(Box.createVerticalGlue());
    selectButtonsPanel.add(innerSelectPanel);
    selectButtonsPanel.add(Box.createVerticalGlue());

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestFrame2 extends JPanel {
   public static final String[] COLS = { "One", "Two", "Three" };
   public static final String[][] BTN_LABELS = { { "S", "S", "D", "D" },
         { "A", "U", "D", "D" } };

   public TestFrame2() {
      setLayout(new GridLayout(1, 0));
      for (int i = 0; i < 2; i++) {
         add(createPanel(i));
      }
   }

   private JPanel createPanel(int row) {
      int gap = 3;
      JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, gap));
      btnPanel.setBorder(BorderFactory.createEmptyBorder(0, gap, 0, gap));
      btnPanel.setOpaque(false);
      for (int i = 0; i < BTN_LABELS[row].length; i++) {
         JButton btn = new JButton(BTN_LABELS[row][i]);
         btnPanel.add(btn);
      }
      btnPanel.setMaximumSize(btnPanel.getPreferredSize());

      JPanel rightPanel = new JPanel();
      rightPanel.setBackground(Color.red);
      rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));
      rightPanel.add(Box.createVerticalGlue());
      rightPanel.add(btnPanel);
      rightPanel.add(Box.createVerticalGlue());

      JPanel panel = new JPanel(new BorderLayout());
      panel.add(new JScrollPane(new JTable(new DefaultTableModel(COLS, 5))),
            BorderLayout.CENTER);
      panel.add(rightPanel, BorderLayout.LINE_END);
      return panel;
   }

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

      JFrame frame = new JFrame("TestFrame2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

很好的例子。我只需要开始逐渐习惯嵌套面板。我开始认为Swing是远比其他GUI(非常动态)更好的选择。 - user2199160

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接