我正在编写一个程序来模拟java中的windows计算器。我有大部分图形,但当我添加文本区域(显示)时,它会破坏格式,甚至不显示。 一个有趣的事情是,在放入文本区域之前,大多数按钮仅显示“...”而不是实际值。据推测,这是因为文本对于按钮来说太大了,但是,随着显示器的添加,这些按钮突然变得足够大以显示按钮上的全文,并且对于框架来说它变得太宽。
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
{
public static Scanner in = new Scanner(System.in);
//sets up each JButton
JButton[] button = new JButton[28];
JTextArea display = new JTextArea(1,20);
//sets up all the text to put on the buttons
String[] buttonString = {"MC", "MR", "MS", "M+", "M-",
"<-", "CE", "C", "+/-", "squ",
"7", "8", "9", "/", "%",
"4", "5", "6", "*", "1/x",
"1", "2", "3", "-", "=",
"0", ".", "+"};
//sets up the boolean values for the different operations
boolean[] function = {false,false,false,false};
//temporary double values for each number to be for each operation
double temp1 = 0, temp2 = 0;
//set all font to Times New Roman size 13
Font font = new Font("Times New Roman", Font.PLAIN, 12);
public static void main(String[] args)
{
//creates calculator
Calculator calc = new Calculator();
}
public Calculator()
{
//makes a calculator with title and size
super("Calculator");
setDesign();
setSize(210,261);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(3,2,2,3);
int count = 0;
/*c.gridx = 0;
c.gridy = 0;
display.setEditable(false);
display.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
display.setPreferredSize(new Dimension(190,50));
c.gridwidth = 5;
display.setFont(font);
add(display, c);
c.gridwidth = 1;*/
for(int i = 1; i < 5; i++)
{
for(int k = 0; k < 5; k++)
{
c.gridx = k;
c.gridy = i;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(34,27));
button[count].setFont(font);
add(button[count++], c);
}
}
for(int i = 0; i < 4; i++)
{
c.gridx = i;
c.gridy = 5;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(34,27));
button[count].setFont(font);
add(button[count++], c);
}
c.gridx = 4;
c.gridy = 5;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(34,59));
button[count].setFont(font);
c.gridheight = 2;
add(button[count++], c);
c.gridx = 0;
c.gridy = 6;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(73,27));
button[count].setFont(font);
c.gridwidth = 2;
c.gridheight = 1;
add(button[count++], c);
c.gridx = 2;
c.gridy = 6;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(34,27));
button[count].setFont(font);
c.gridwidth = 1;
add(button[count++], c);
c.gridx = 3;
c.gridy = 6;
button[count] = new JButton(buttonString[count]);
button[count].addActionListener(this);
button[count].setPreferredSize(new Dimension(34,27));
button[count].setFont(font);
add(button[count++], c);
setVisible(true);
}
public final void setDesign()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception E){}
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource() == button[10])
display.append("7");
if(ae.getSource() == button[11])
display.append("8");
if(ae.getSource() == button[12])
display.append("9");
if(ae.getSource() == button[15])
display.append("4");
if(ae.getSource() == button[16])
display.append("5");
if(ae.getSource() == button[17])
display.append("6");
if(ae.getSource() == button[20])
display.append("1");
if(ae.getSource() == button[21])
display.append("2");
if(ae.getSource() == button[22])
display.append("3");
if(ae.getSource() == button[7])
clear();
if(ae.getSource() == button[8])
switchSign();
if(ae.getSource() == button[9])
sqrt();
if(ae.getSource() == button[10])
display.append("7");
if(ae.getSource() == button[13])
{
temp1 = Double.parseDouble(display.getText());
function[1] = true;
display.setText("");
}
if(ae.getSource() == button[18])
{
temp1 = Double.parseDouble(display.getText());
function[0] = true;
display.setText("");
}
if(ae.getSource() == button[23])
{
temp1 = Double.parseDouble(display.getText());
function[3] = true;
display.setText("");
}
if(ae.getSource() == button[27])
{
temp1 = Double.parseDouble(display.getText());
function[2] = true;
display.setText("");
}
if(ae.getSource() == button[24])
displayResult();
if(ae.getSource() == button[25])
display.append("0");
if(ae.getSource() == button[6])
display.setText("");
}
public void clear()
{
try
{
display.setText("0");
for(int i = 0; i < 4; i++)
function[i] = false;
temp1 = 0;
temp2 = 0;
}
catch(NullPointerException e){}
}
public void clearEntry()
{
try
{
display.setText("0");
}catch(NullPointerException e){}
}
public void oneoverx()
{
try
{
if(display.getText() != "0")
display.setText("" + Double.parseDouble(display.getText()));
}
catch(NumberFormatException e){}
}
public void sqrt()
{
try
{
double value = Math.sqrt(Double.parseDouble(display.getText()));
display.setText("" + value);
}
catch(NumberFormatException e){}
}
public void switchSign()
{
try
{
double value = Double.parseDouble(display.getText());
if(value != 0)
{
value = value * -1;
display.setText(Double.toString(value));
}
else{}
}
catch(NumberFormatException e){}
}
public void displayResult()
{
double result = 0; //variable for result
temp2 = Double.parseDouble(display.getText()); //second temp number from display
try
{
if(Double.toString(temp1).contains("-"))
{
String tempString = Double.toString(temp1);
String temp = Double.toString(temp1).substring(tempString.indexOf("-"));
temp1 = Double.parseDouble(temp) * -1;
}
if(Double.toString(temp2).contains("-"))
{
String tempString = Double.toString(temp2);
String temp = Double.toString(temp2).substring(tempString.indexOf("-"));
temp2 = Double.parseDouble(temp) * -1;
}
}
catch(ArrayIndexOutOfBoundsException e){}
try
{
if(function[0])
result = temp1 * temp2;
else if(function[1])
result = temp1 / temp2;
else if(function[2])
result = temp1 + temp2;
else if(function[3])
result = temp1 - temp2;
display.setText(Double.toString(result));
for(int i = 0; i < 4; i++)
function[i] = false;
}
catch(NumberFormatException e){}
}
}
这是我的代码,我不完全确定它有什么问题。目前,显示已注释掉,如果您想在块中找到它,可以使用以下代码
c.gridx = 0;
c.gridy = 0;
display.setEditable(false);
display.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
display.setPreferredSize(new Dimension(190,50));
c.gridwidth = 5;
display.setFont(font);
add(display, c);
c.gridwidth = 1;
我也不确定我是否正确地把所有这些都放进去了,我以前从未问过这里的问题。谢谢!
编辑:这是我试图模仿的计算器,但具有更“金属”的外观和感觉。我已经有了外观和感觉所以看起来我想要它在我的计算器上,但我想保持尺寸准确。 calculator
答案 0 :(得分:1)
只需从代码中删除所有setPreferredSize()
和setSize()
,然后在添加所有组件后再调用pack()
。
使此窗口的大小适合其子组件的首选大小和布局。如果任一维度小于上一次调用setMinimumSize方法所指定的最小大小,则会自动放大窗口的最终宽度和高度。
如果窗口和/或其所有者尚未显示,则在计算首选大小之前,它们都可显示。窗口在计算其大小后进行验证。
再做一次改变:
GridBagConstraints c = new GridBagConstraints();
c.fill=GridBagConstraints.BOTH; // ADD THIS LINE
详细了解GridBagConstraints.fill属性。
快照: