如何设置某些特定 JButton 组件(在本例中为 btnPlus)的尺寸?

How can I set the dimension of some particular JButton component (in this case btnPlus)?

我尝试使用 setSize() 但没有用。然后我还使用了 setPreferredSize(new Dimension(x,y))。是的,它确实有效,但它会更改该 (oPanel) 面板中所有组件的大小。我只想改变 btnPlus 的大小。

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MyCalc {

public static void main(String[] args) {

    JFrame main= new JFrame();
    JPanel bPanel= new JPanel();
    JPanel oPanel= new JPanel();
    JPanel Txt= new JPanel();
    JPanel Panel=new JPanel();
    JButton btn0= new JButton("0");
    JButton btn1= new JButton("1");
    JButton btn2= new JButton("2");
    JButton btn3= new JButton("3");
    JButton btn4= new JButton("4");
    JButton btn5= new JButton("5");
    JButton btn6= new JButton("6");
    JButton btn7= new JButton("7");
    JButton btn8= new JButton("8");
    JButton btn9= new JButton("9");
    JButton btnDot= new JButton(".");
    JButton btnPlus= new JButton("+");
    JButton btnMinus= new JButton("-");
    JButton btnEquals= new JButton("=");
    //JTextField tf= new JTextField();
    JTextArea ta= new JTextArea();

    ta.setColumns(20);
    ta.setRows(3);
    //ta.setViewPortView()

    main.setLayout(new BorderLayout(20,20));

    Txt.setLayout(new BorderLayout());
    //Txt.add(tf,BorderLayout.NORTH);
    Txt.add(ta,BorderLayout.SOUTH);

    bPanel.setLayout(new GridLayout(4,3,5,5));
    bPanel.add(btn0);
    bPanel.add(btn1);
    bPanel.add(btn2);
    bPanel.add(btn3);
    bPanel.add(btn4);
    bPanel.add(btn5);
    bPanel.add(btn6);
    bPanel.add(btn7);
    bPanel.add(btn8);
    bPanel.add(btn9);
    bPanel.add(btnDot);

    oPanel.setLayout(new GridLayout(3,1,5,5));
    //oPanel.setMaximumSize(new Dimension(400,400));
    oPanel.add(btnPlus);
    oPanel.add(btnMinus);
    oPanel.add(btnEquals);

    btnPlus.setPreferredSize(new Dimension(50,100));
    btnMinus.setPreferredSize(new Dimension(25,25));
    btnPlus.setPreferredSize(new Dimension(50,100));

    Panel.setLayout(new FlowLayout());
    Panel.add(bPanel);
    Panel.add(oPanel);

    //main.getContentPane().add(bPanel,BorderLayout.LINE_START);
    //main.getContentPane().add(oPanel, BorderLayout.LINE_END);
    main.getContentPane().add(Panel,BorderLayout.CENTER);
    main.getContentPane().add(Txt, BorderLayout.PAGE_START);

    main.setSize(300, 300);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);
}

}

我认为您的主要问题在于 GridLayout 的使用,它根据您提供的配置和容器的大小为容器中的所有组件提供相等的 space。

请考虑使用 GridBagLayout,这会给您更多的控制权。

有关详细信息,请参阅 How to Use GridLayout and How to Use GridBagLayout

你也应该看看 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 是的,你应该避免它