如何将按钮(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);
}
}
答案 0 :(得分:4)
考虑使用自己的布局嵌套JPanel。 BoxLayout可以允许您将包含JButton的内部JPanel居中。内部面板使用GridLayout,使用外部JPanel的BoxLayout在顶部和底部添加了胶水:
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();
}
});
}
}