Java JPanel中按钮的中心对齐
如何将按钮(S、S、D&D和A、U、D&D)与面板中间(蓝色和红色)对齐?面板可以增长(高度不是宽度),但是按钮应该保持在中间并且保持相同的尺寸。所以GridLayout已经过时了Java JPanel中按钮的中心对齐,java,swing,jpanel,Java,Swing,Jpanel,如何将按钮(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 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);
}
}
考虑使用各自的布局嵌套JPanel。BoxLayout可以让您将容纳JButtons的内部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();
}
});
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.GridLayout;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
公共类TestFrame2扩展了JPanel{
公共静态最终字符串[]COLS={“一”、“二”、“三”};
公共静态最终字符串[][]BTN_标签={{{“S”、“S”、“D”、“D},
{“A”、“U”、“D”、“D”};
公共测试框架2(){
setLayout(新的GridLayout(1,0));
对于(int i=0;i<2;i++){
添加(createPanel(i));
}
}
专用JPanel createPanel(int行){
int gap=3;
JPanel btnPanel=新的JPanel(新的网格布局(0,1,0,gap));
btnPanel.setBorder(BorderFactory.createEmptyByOrder(0,间隙,0,间隙));
btnPanel.set不透明(假);
对于(int i=0;i
当前代码有什么问题?按钮是顶部对齐的。很好的例子。我只需要开始使用嵌套面板。我开始认为Swing是一个比其他GUI更好的GUI(非常动态)。