Java 如何在一个跨两个网格的按钮的一个网格中居中放置文本?

Java 如何在一个跨两个网格的按钮的一个网格中居中放置文本?,java,swing,user-interface,layout-manager,gridbaglayout,Java,Swing,User Interface,Layout Manager,Gridbaglayout,我正在尝试重新创建Mac计算器GUI。我在这个项目中使用Swing和GridBagLayout。 我设法将0放置在一个跨越两个柱网轴线的按钮中,但我希望将其居中放置在第一个柱网轴线上,而不是两个柱网轴线上 基本上,我希望按钮看起来完全像: 在计算器中,第一个柱网(由按钮“AC”、“1”、“4”、“7”和“0”组成)使文本均匀居中。 这里我尝试使用setHorizontalAlignment(SwingConstants.LEFT),但结果不是我想要的 JButton bt n_0 = new

我正在尝试重新创建Mac计算器GUI。我在这个项目中使用Swing和
GridBagLayout

我设法将0放置在一个跨越两个柱网轴线的按钮中,但我希望将其居中放置在第一个柱网轴线上,而不是两个柱网轴线上

基本上,我希望按钮看起来完全像:

在计算器中,第一个柱网
(由按钮“AC”、“1”、“4”、“7”和“0”组成)
使文本均匀居中。
这里我尝试使用
setHorizontalAlignment(SwingConstants.LEFT)
,但结果不是我想要的

JButton bt

n_0 = new JButton("0");
btn_0.setHorizontalAlignment(SwingConstants.LEFT);
GridBagConstraints gbc_btn_0 = new GridBagConstraints();
gbc_btn_0.fill = GridBagConstraints.HORIZONTAL;
gbc_btn_0.gridwidth = 2;
gbc_btn_0.insets = new Insets(0, 0, 5, 5);
gbc_btn_0.gridx = 0;
gbc_btn_0.gridy = 5;
frame.getContentPane().add(btn_0, gbc_btn_0);

是否有可能实现这一点,或者是否有其他方法可以实现这一点?

我建议您使用:

mig_布局库


允许您进行简单/适应性强的设计,您可以解决您的问题。

您确实需要按钮吗?我不习惯Mac,但如果那些计算器键不需要实际的“按钮”行为(3D效果、按下时移动文本等),也许一个普通的JPanel就可以了

在这种情况下,如果“0”键是JPanel,则对其应用GridLayout(1,2)并将JLabel(“0”)放在第一个单元格中,而第二个单元格中没有任何内容可能会达到您想要的结果

现在,您当然需要在JPanel级别处理单击和键事件(更多信息请参见示例),但我认为这是一种“干净”(从组件层次结构的角度)的方式

更新:以下是我的意思(介于####评论之间):

在我看来,它非常接近预期的布局。。。(单击时,请参见控制台)


1)要更快获得更好的帮助,请添加或。2) 与布局问题无关,但请参见此。它使用
ScriptEngine
计算文本字段中的表达式。(1-)这不是布局问题。GridBagLayout可以轻松处理跨多个单元的组件。是文本在组件中的位置。JButton将文本定位为左对齐、居中对齐或右对齐。它不知道如何将文本居中放置在按钮的“左半部分”。这是正确的,但使用migLayout很容易做到。migLayout不控制文本的绘制方式。它控制组件的大小/位置。因此我建议不要使用JButtons。。。请参阅我的最新答案。(注意:我输入了GridLayout(2,1)而不是GridLayout(1,2)。已修复。)(1+)更详细。尽管您仍然可以使用JButton来执行此操作。JButton可以定制为类似JLabel的外观。从
开始(false)
。这样,您就可以通过按钮使用
操作
操作侦听器
。但是,同样,这个解决方案只有在你不需要“点击”效果的情况下才有效,这不是最好的UI,因为用户在点击某个东西时应该总是得到一些反馈。@hazy\u编码如果答案适合你的需要,你能接受吗?如果没有,请告诉我们。
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Calculator {
    public static final Color CALC_BACKGROUND = new Color(44, 45, 47);
    public static final Color KEY_BG_LAST_OPERATION = new Color(255,159,12);
    public static final Color KEY_BG_NUMBER = new Color(96,97,99);
    public static final Color KEY_BG_SPECIAL = new Color(64,65,67);
    public static final Font BUTTON_FONT = new Font("SansSerif", Font.PLAIN, 30);    

    private static JComponent make0Button(String text) {
        JPanel panel = new JPanel();
        panel.setBorder(new LineBorder(CALC_BACKGROUND));
        panel.setBackground(KEY_BG_NUMBER);
        final JLabel label = new JLabel(text);
        label.setFont(BUTTON_FONT);
        label.setForeground(Color.WHITE);
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setVerticalAlignment(JLabel.CENTER);

        //#######################################
        // The "0" key is a panel with two cells
        panel.setLayout(new GridLayout(1, 2));
        // The "0" text on the left
        panel.add(label);
        // A blank (dummy) label on the right
        panel.add(new JLabel(" "));
        //#######################################

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(text);
            }
        });
        return panel;
    }

    private static JComponent makeStdButton(String text, Color color) {
        JPanel panel = new JPanel();
        panel.setBorder(new LineBorder(CALC_BACKGROUND));
        panel.setBackground(color);
        panel.setLayout(new GridLayout(1, 1));
        JLabel label = new JLabel(text);
        label.setFont(BUTTON_FONT);
        label.setForeground(Color.WHITE);
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setVerticalAlignment(JLabel.CENTER);
        panel.add(label);
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(text);
            }
        });
        return panel;
    }

    public static void addComponentsToPane(Container container) {
        container.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        // Result (top)
        c.anchor = GridBagConstraints.EAST;
        c.fill = GridBagConstraints.BOTH;
        c.gridwidth = 4;
        c.gridx = 0; c.gridy = 0;
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBackground(CALC_BACKGROUND);
        final JLabel resultLabel = new JLabel("0");
        resultLabel.setFont(new Font("SansSerif", Font.PLAIN, 100));
        resultLabel.setForeground(Color.WHITE);
        panel.add(resultLabel, BorderLayout.EAST);
        container.add(panel, c);

        // Special "0" key
        c = new GridBagConstraints();
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.BOTH;
        c.gridwidth = 2;
        c.gridx = 0; c.gridy = 5;
        container.add(make0Button("0"), c);

        // All other keys
        c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.gridwidth = 1;
        c.weightx = 1;
        c.weighty = 1;
        c.gridx = 0; c.gridy = 1;
        container.add(makeStdButton("AC", KEY_BG_SPECIAL), c);
        c.gridx = 1; c.gridy = 1;
        container.add(makeStdButton("+/-", KEY_BG_SPECIAL), c);
        c.gridx = 2; c.gridy = 1;
        container.add(makeStdButton("%", KEY_BG_SPECIAL), c);
        c.gridx = 3; c.gridy = 1;
        container.add(makeStdButton("/", KEY_BG_LAST_OPERATION), c);

        c.gridx = 0; c.gridy = 2;
        container.add(makeStdButton("7", KEY_BG_NUMBER), c);
        c.gridx = 1; c.gridy = 2;
        container.add(makeStdButton("8", KEY_BG_NUMBER), c);
        c.gridx = 2; c.gridy = 2;
        container.add(makeStdButton("9", KEY_BG_NUMBER), c);
        c.gridx = 3; c.gridy = 2;
        container.add(makeStdButton("x", KEY_BG_LAST_OPERATION), c);

        c.gridx = 0; c.gridy = 3;
        container.add(makeStdButton("4", KEY_BG_NUMBER), c);
        c.gridx = 1; c.gridy = 3;
        container.add(makeStdButton("5", KEY_BG_NUMBER), c);
        c.gridx = 2; c.gridy = 3;
        container.add(makeStdButton("6", KEY_BG_NUMBER), c);
        c.gridx = 3; c.gridy = 3;
        container.add(makeStdButton("-", KEY_BG_LAST_OPERATION), c);

        c.gridx = 0; c.gridy = 4;
        container.add(makeStdButton("1", KEY_BG_NUMBER), c);
        c.gridx = 1; c.gridy = 4;
        container.add(makeStdButton("2", KEY_BG_NUMBER), c);
        c.gridx = 2; c.gridy = 4;
        container.add(makeStdButton("3", KEY_BG_NUMBER), c);
        c.gridx = 3; c.gridy = 4;
        container.add(makeStdButton("+", KEY_BG_LAST_OPERATION), c);

        c.gridx = 2; c.gridy = 5;
        container.add(makeStdButton(".", KEY_BG_NUMBER), c);
        c.gridx = 3; c.gridy = 5;
        container.add(makeStdButton("=", KEY_BG_LAST_OPERATION), c);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Calculator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addComponentsToPane(frame.getContentPane());
        frame.setSize(400,600);
        frame.setVisible(true);
    }

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