java - 如何根据窗口大小调整按钮大小?
问题描述
我不知道如何使我的按钮可调整大小,我想不通。我曾尝试使用:
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
这在技术上是有效的,但不是真的,因为它使数字按钮占据了整个屏幕,没有空间用于文本框或“(-)”、“del”和“clr”按钮。
我真的想不出办法来做到这一点,在 python 中有相对宽度/高度,这基本上使这不是问题,那么我将如何在这里做类似的事情呢?
package panda.org;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator implements ActionListener{
JFrame frame;
JTextField textfield;
JButton[] numberButtons = new JButton[10];
JButton[] functionButtons = new JButton[9];
JButton addButton,subButton,mulButton,divButton;
JButton decButton, equButton, delButton, clrButton, negButton;
JPanel panel;
Font myFont = new Font("Serif Plain",Font.BOLD,30);
double num1=0,num2=0,result=0;
char operator;
Calculator(){
frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420, 550);
frame.setLayout(null);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
Image icon = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Gaming MSI\\Pictures\\Saved Pictures\\download.png");
frame.setIconImage(icon);
textfield = new JTextField();
textfield.setBounds(50, 25, 300, 50);
textfield.setFont(myFont);
textfield.setEditable(false);
addButton = new JButton("+");
subButton = new JButton("-");
mulButton = new JButton("x");
divButton = new JButton("÷");
decButton = new JButton(".");
equButton = new JButton("=");
delButton = new JButton("Del");
clrButton = new JButton("Clr");
negButton = new JButton("(-)");
functionButtons[0] = addButton;
functionButtons[1] = subButton;
functionButtons[2] = mulButton;
functionButtons[3] = divButton;
functionButtons[4] = decButton;
functionButtons[5] = equButton;
functionButtons[6] = delButton;
functionButtons[7] = clrButton;
functionButtons[8] = negButton;
for(int i =0;i<9;i++) {
functionButtons[i].addActionListener(this);
functionButtons[i].setFont(myFont);
functionButtons[i].setFocusable(false);
}
for(int i =0;i<10;i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(this);
numberButtons[i].setFont(myFont);
numberButtons[i].setFocusable(false);
}
negButton.setBounds(50,430,100,50);
delButton.setBounds(150,430,100,50);
clrButton.setBounds(250,430,100,50);
panel = new JPanel();
panel.setBounds(50, 100, 300, 300);
panel.setLayout(new GridLayout(4,4,10,10));
panel.add(numberButtons[1]);
panel.add(numberButtons[2]);
panel.add(numberButtons[3]);
panel.add(addButton);
panel.add(numberButtons[4]);
panel.add(numberButtons[5]);
panel.add(numberButtons[6]);
panel.add(subButton);
panel.add(numberButtons[7]);
panel.add(numberButtons[8]);
panel.add(numberButtons[9]);
panel.add(mulButton);
panel.add(decButton);
panel.add(numberButtons[0]);
panel.add(equButton);
panel.add(divButton);
frame.add(panel);
frame.add(negButton);
frame.add(delButton);
frame.add(clrButton);
frame.add(textfield);
frame.setVisible(true);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
}
@Override
public void actionPerformed(ActionEvent e) {
for(int i=0;i<10;i++) {
if(e.getSource() == numberButtons[i]) {
textfield.setText(textfield.getText().concat(String.valueOf(i)));
}
}
if(e.getSource()==decButton) {
textfield.setText(textfield.getText().concat("."));
}
if(e.getSource()==addButton) {
num1 = Double.parseDouble(textfield.getText());
operator ='+';
textfield.setText("");
}
if(e.getSource()==subButton) {
num1 = Double.parseDouble(textfield.getText());
operator ='-';
textfield.setText("");
}
if(e.getSource()==mulButton) {
num1 = Double.parseDouble(textfield.getText());
operator ='*';
textfield.setText("");
}
if(e.getSource()==divButton) {
num1 = Double.parseDouble(textfield.getText());
operator ='/';
textfield.setText("");
}
if(e.getSource()==equButton) {
num2=Double.parseDouble(textfield.getText());
switch(operator) {
case'+':
result=num1+num2;
break;
case'-':
result=num1-num2;
break;
case'*':
result=num1*num2;
break;
case'/':
result=num1/num2;
break;
}
textfield.setText(String.valueOf(result));
num1=result;
}
if(e.getSource()==clrButton) {
textfield.setText("");
}
if(e.getSource()==delButton) {
String string = textfield.getText();
textfield.setText("");
for(int i=0;i<string.length()-1;i++) {
textfield.setText(textfield.getText()+string.charAt(i));
}
}
if(e.getSource()==negButton) {
double temp = Double.parseDouble(textfield.getText());
temp*=-1;
textfield.setText(String.valueOf(temp));
}
}
}
解决方案
你不会拘泥于一个布局管理器,事实上,包含按钮的面板是复合布局管理器的一个很好的用途,其中按钮面板专注于一项工作,但它允许它根据需要集成到另一个布局中.
这是一个使用GridBagLayout
外部布局管理器的非常基本的示例。您还可以将功能按钮添加到自己的面板中,并根据您的需要独立调整其布局。
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Calculator implements ActionListener {
JFrame frame;
JTextField textfield;
JButton[] numberButtons = new JButton[10];
JButton[] functionButtons = new JButton[9];
JButton addButton, subButton, mulButton, divButton;
JButton decButton, equButton, delButton, clrButton, negButton;
JPanel panel;
Font myFont = new Font("Serif Plain", Font.BOLD, 30);
double num1 = 0, num2 = 0, result = 0;
char operator;
Calculator() {
frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420, 550);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
Image icon = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Gaming MSI\\Pictures\\Saved Pictures\\download.png");
frame.setIconImage(icon);
textfield = new JTextField();
// textfield.setBounds(50, 25, 300, 50);
textfield.setFont(myFont);
textfield.setEditable(false);
addButton = new JButton("+");
subButton = new JButton("-");
mulButton = new JButton("x");
divButton = new JButton("÷");
decButton = new JButton(".");
equButton = new JButton("=");
delButton = new JButton("Del");
clrButton = new JButton("Clr");
negButton = new JButton("(-)");
functionButtons[0] = addButton;
functionButtons[1] = subButton;
functionButtons[2] = mulButton;
functionButtons[3] = divButton;
functionButtons[4] = decButton;
functionButtons[5] = equButton;
functionButtons[6] = delButton;
functionButtons[7] = clrButton;
functionButtons[8] = negButton;
for (int i = 0; i < 9; i++) {
functionButtons[i].addActionListener(this);
functionButtons[i].setFont(myFont);
functionButtons[i].setFocusable(false);
}
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(this);
numberButtons[i].setFont(myFont);
numberButtons[i].setFocusable(false);
}
// negButton.setBounds(50, 430, 100, 50);
// delButton.setBounds(150, 430, 100, 50);
// clrButton.setBounds(250, 430, 100, 50);
JPanel contentPane = new JPanel(new GridBagLayout());
contentPane.setBorder(new EmptyBorder(10, 10, 10, 10));
frame.setContentPane(contentPane);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = gbc.REMAINDER;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.weightx = 1;
frame.add(textfield, gbc);
panel = new JPanel();
panel.setLayout(new GridLayout(4, 4, 10, 10));
panel.add(numberButtons[1]);
panel.add(numberButtons[2]);
panel.add(numberButtons[3]);
panel.add(addButton);
panel.add(numberButtons[4]);
panel.add(numberButtons[5]);
panel.add(numberButtons[6]);
panel.add(subButton);
panel.add(numberButtons[7]);
panel.add(numberButtons[8]);
panel.add(numberButtons[9]);
panel.add(mulButton);
panel.add(decButton);
panel.add(numberButtons[0]);
panel.add(equButton);
panel.add(divButton);
gbc.weighty = 1;
frame.add(panel, gbc);
// These could be in their own panel
// as well!
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridwidth = 1;
gbc.weightx = 0.3;
frame.add(negButton, gbc);
gbc.gridx++;
frame.add(delButton, gbc);
gbc.gridx++;
frame.add(clrButton, gbc);
frame.setVisible(true);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
}
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 10; i++) {
if (e.getSource() == numberButtons[i]) {
textfield.setText(textfield.getText().concat(String.valueOf(i)));
}
}
if (e.getSource() == decButton) {
textfield.setText(textfield.getText().concat("."));
}
if (e.getSource() == addButton) {
num1 = Double.parseDouble(textfield.getText());
operator = '+';
textfield.setText("");
}
if (e.getSource() == subButton) {
num1 = Double.parseDouble(textfield.getText());
operator = '-';
textfield.setText("");
}
if (e.getSource() == mulButton) {
num1 = Double.parseDouble(textfield.getText());
operator = '*';
textfield.setText("");
}
if (e.getSource() == divButton) {
num1 = Double.parseDouble(textfield.getText());
operator = '/';
textfield.setText("");
}
if (e.getSource() == equButton) {
num2 = Double.parseDouble(textfield.getText());
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
textfield.setText(String.valueOf(result));
num1 = result;
}
if (e.getSource() == clrButton) {
textfield.setText("");
}
if (e.getSource() == delButton) {
String string = textfield.getText();
textfield.setText("");
for (int i = 0; i < string.length() - 1; i++) {
textfield.setText(textfield.getText() + string.charAt(i));
}
}
if (e.getSource() == negButton) {
double temp = Double.parseDouble(textfield.getText());
temp *= -1;
textfield.setText(String.valueOf(temp));
}
}
}
查看在容器内布局组件以获取更多详细信息
推荐阅读
- python - 使用 scipy.findpeaks 在重叠峰的情况下找到合适的峰宽和峰高
- ios - 带有自定义对象的场景的情节提要依赖注入
- powershell - 从 certutil 转储或通过序列号获取颁发 CA (Windows Server PKI)
- python - 根据键从多个(列表)目录创建字典
- django - Django REST框架POST请求使用序列化器在嵌套字段内具有动态字段
- sql - 在sql中使用if else条件的子字符串
- angularjs - AngularJS 绑定:什么是“
我一直在寻找超过 10 分钟的答案,所以我相信其他人也会觉得这很有用。
什么是“<?” 在指令的 AngularJS 数据绑定中?
- c++ - 基于范围的 for 循环内的 const 自动引用的生命周期是否延伸到范围的末尾?
- reactjs - 访问 aws amplify 订阅中的最新状态值反应
- java - Java 继承、构造函数和“超级”