gpt4 book ai didi

java - frame.setResizable(false) 不起作用!它改变窗口大小而不是保持尺寸

转载 作者:行者123 更新时间:2023-12-01 08:07:24 29 4
gpt4 key购买 nike

frame.setResizable(false);

在我的 TestCalculator 类中,我的 Calculator 类的 JFrame 无法调整大小(不是一个字),但它在框架内的底部和右侧添加了一些像素......或者从一两个面板中删除了一些像素。我不知 Prop 体如何表达,但是我想让框架具有固定大小,没有额外的像素和垃圾

是的,我确实在另一个网站上询问过,但他们无法帮助我,这将在明天早上到期,我已经为此工作了大约两周,昨天才使计算器工作。我查了一天一夜,没有找到具体的解决办法。

我不确定到底是什么导致它无法正常工作(废话),但它可能在这段代码中的任何地方,也许是它的顺序,我不知道。

计算器类别:

public class SimpleArithmeticCalculator extends JPanel implements ActionListener {

private static final int BTN_ONE = 0;

private static final int BTN_TWO = 1;

private static final int BTN_THREE = 2;

private static final int BTN_DIV = 3;

private static final int BTN_FOUR = 4;

private static final int BTN_FIVE = 5;

private static final int BTN_SIX = 6;

private static final int BTN_MULT = 7;

private static final int BTN_SEVEN = 8;

private static final int BTN_EIGHT = 9;

private static final int BTN_NINE = 10;

private static final int BTN_MINUS = 11;

private static final int BTN_ZERO = 12;

private static final int BTN_DECIMAL = 13;

private static final int BTN_POWER = 14;

private static final int BTN_PLUS = 15;

private static final int BTN_CLEAR = 16;

private static final int BTN_PERCENT = 17;

private static final int BTN_BACKSPACE = 18;

private static final int BTN_CALC = 19;

private static final int NUM_BUTTONS = 20;



private static final int OP_MULT = 0;

private static final int OP_DIV = 1;

private static final int OP_PLUS = 2;

private static final int OP_MINUS = 3;

private static final int OP_POWER = 4;

private static final int OP_PERCENT = 5;

private static char[] buttonTexts = {'7' , '8' , '9' , '/' , '4' ,
'5' , '6' , '*' , '1' , '2' ,
'3' , '-' , '0' , '.' , '^' ,
'+' , 'C' , '%' , '<' , '='};

private static final int[] buttonKeys = {
KeyEvent.VK_NUMPAD7 , KeyEvent.VK_NUMPAD8 , KeyEvent.VK_NUMPAD9 , KeyEvent.VK_DIVIDE , KeyEvent.VK_NUMPAD4 ,
KeyEvent.VK_NUMPAD5 , KeyEvent.VK_NUMPAD6 , KeyEvent.VK_MULTIPLY , KeyEvent.VK_NUMPAD1 , KeyEvent.VK_NUMPAD2 ,
KeyEvent.VK_NUMPAD3 , KeyEvent.VK_MINUS , KeyEvent.VK_NUMPAD0 , KeyEvent.VK_STOP, '^',
KeyEvent.VK_PLUS, KeyEvent.VK_C , '%' , KeyEvent.VK_BACK_SPACE , KeyEvent.VK_ENTER
};

private Font font;

private JButton[] buttons;

private JTextField displayText;

public JPanel calcPanel;

private JPanel textPanel;

private JPanel buttonPanel;

private String buffer;

private int op;

private int opStored;

private double lhs;

private double rhs;

private double rhsStored;

private boolean left;

private boolean clear;

private char lastAction;

public SimpleArithmeticCalculator() {

super();

buffer = new String("0.0");

op = -1;

opStored = -1;

lhs = 0.0;

rhs = 0.0;

rhsStored = 0.0;

left = true;

clear = true;

lastAction = '=';

font = Font.decode("Courier PLAIN 24");

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}

catch (Exception e) {

}

calcPanel = new JPanel();

textPanel = new JPanel();

buttonPanel = new JPanel();

buttonPanel.setForeground(null);

textPanel.setForeground(null);

calcPanel.setForeground(null);

textPanel.setLayout(new GridLayout(1,1,0,0));

buttonPanel.setLayout(new GridLayout(5 , 10 , 10 , 10));

displayText = new JTextField("" , 20);

displayText.setHorizontalAlignment(JTextField.RIGHT);

displayText.setFont(font);

displayText.setEditable(false);

textPanel.add(displayText);

buttons = new JButton[NUM_BUTTONS];

for (int i = 0 ; i < NUM_BUTTONS ; ++i) {

buttons[i] = new JButton("" + buttonTexts[i]);

buttons[i].setMnemonic(buttonKeys[i]);

buttons[i].setFont(font);

buttons[i].setMinimumSize(new Dimension(50,50));

buttons[i].setActionCommand("" + buttonTexts[i]);

buttons[i].addActionListener(this);

buttonPanel.add(buttons[i]);

}

buttons[BTN_POWER].setText("^");

buttons[BTN_PERCENT].setText("%");

buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

textPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

calcPanel.setLayout(new BorderLayout());

calcPanel.add(textPanel , BorderLayout.NORTH);

calcPanel.add(buttonPanel , BorderLayout.CENTER);

add(calcPanel);

for (int i = 0 ; i < NUM_BUTTONS ; ++i) {

buttons[i].setMaximumSize(buttons[i].getSize());

}

}

public void SetColors(Color bg , Color textbg , Color textcolor) {

calcPanel.setBackground(bg);

calcPanel.setVisible(true);

calcPanel.setOpaque(false);

buttonPanel.setBackground(bg);

buttonPanel.setVisible(true);

buttonPanel.setOpaque(false);

textPanel.setBackground(bg);

textPanel.setOpaque(false);

textPanel.setVisible(true);

displayText.setBackground(textbg);

displayText.setForeground(textcolor);

for (int i = 0 ; i < NUM_BUTTONS ; ++i) {

buttons[i].setForeground(textcolor);

}

}

public void actionPerformed(ActionEvent ev) {

String action = ev.getActionCommand();

char c = action.charAt(0);

boolean calc = false;

if (c == buttonTexts[BTN_CLEAR]) {

buffer = "";

left = true;

}

else if (c == buttonTexts[BTN_BACKSPACE]) {

if (buffer.length() > 0) {

buffer = buffer.substring(0 , buffer.length() - 1);

}

if (lastAction == buttonTexts[BTN_CALC]) {

left = true;

}

clear = false;

}

else if ((c == buttonTexts[BTN_CALC]) || isOpCharacter(c)) {

int opCurrent = op;

if (c == buttonTexts[BTN_CALC]) {

if (!left) {

calc = true;

if (isOpCharacter(lastAction)) {

rhs = GetBufferValue();

rhsStored = rhs;

opCurrent = op;

opStored = op;

}

else if (lastAction == buttonTexts[BTN_CALC]) {

rhs = rhsStored;

opCurrent = opStored;

}

else {

rhs = GetBufferValue();

rhsStored = rhs;

opCurrent = op;

opStored = op;

}

}

}

else if (isOpCharacter(c)) {

opStored = op;

if (c == buttonTexts[BTN_MULT]) {op = OP_MULT;}

if (c == buttonTexts[BTN_DIV]) {op = OP_DIV;}

if (c == buttonTexts[BTN_PLUS]) {op = OP_PLUS;}

if (c == buttonTexts[BTN_MINUS]) {op = OP_MINUS;}

if (c == buttonTexts[BTN_POWER]) {op = OP_POWER;}

if (c == buttonTexts[BTN_PERCENT]) {op = OP_PERCENT;}

if (lastAction == buttonTexts[BTN_CALC]) {

lhs = GetBufferValue();

clear = true;

}

else if (isOpCharacter(lastAction)) {

}

else {


if (left) {

lhs = GetBufferValue();

left = false;

}

else {

calc = true;

rhs = GetBufferValue();

opCurrent = opStored;

opStored = op;

}

clear = true;

}

}

if (calc) {

double result = 0.0;

if (opCurrent == OP_MULT) {result = lhs * rhs;}

if (opCurrent == OP_DIV) {result = lhs / rhs;}

if (opCurrent == OP_PLUS) {result = lhs + rhs;}

if (opCurrent == OP_MINUS) {result = lhs - rhs;}

if (opCurrent == OP_POWER) {result = Math.pow(lhs,rhs);}

if (opCurrent == OP_PERCENT) {result = lhs / 100;}

lhs = result;

buffer = "" + result;

clear = true;

}

}

else {

if (lastAction == buttonTexts[BTN_CALC]) {

left = true;

}

if (clear) {

buffer = "";

clear = false;

}

if (c == buttonTexts[BTN_DECIMAL]) {

if (buffer.indexOf('.') == -1) {

if (buffer.length() == 0 || (buffer.length() == 1 && buffer.charAt(0) == '-')) {

buffer += "0";

}

buffer += ".";

}

}

else if (c == buttonTexts[BTN_ZERO]) {

if (buffer.length() == 0 || (buffer.length() == 1 && buffer.charAt(0) == '-')) {

buffer += "0.";

}

else if (buffer.length() > 0 && (isNonZeroNumber(buffer.charAt(0)) ||
(buffer.charAt(0) == '-' && isNonZeroNumber(buffer.charAt(1))))) {

buffer += "0";

}

else if (buffer.compareTo("0") == 0 || buffer.compareTo("-0") == 0) {

}

else {

buffer += "0";

}

}

else {

if (!buffer.equals("0") && !buffer.equals("-0")) {

buffer += c;

}

}

}

lastAction = c;

displayText.setText(buffer);

}

public double GetBufferValue() {

double d = 0.0;

try {

d = Double.parseDouble(buffer);

}

catch (NumberFormatException e) {

System.out.println("NumberFormatException in GetBufferValue()");

}

return d;

}

public boolean isOpCharacter(char c) {

return ((c == buttonTexts[BTN_MULT]) ||

(c == buttonTexts[BTN_DIV]) ||

(c == buttonTexts[BTN_PLUS]) ||

(c == buttonTexts[BTN_MINUS]) ||

(c == buttonTexts[BTN_POWER]) ||

(c == buttonTexts[BTN_PERCENT]));

}

public boolean isNumericCharacter(char c) {

return ((c == buttonTexts[BTN_ZERO]) ||

(c == buttonTexts[BTN_ONE]) ||

(c == buttonTexts[BTN_TWO]) ||

(c == buttonTexts[BTN_THREE]) ||

(c == buttonTexts[BTN_FOUR]) ||

(c == buttonTexts[BTN_FIVE]) ||

(c == buttonTexts[BTN_SIX]) ||

(c == buttonTexts[BTN_SEVEN]) ||

(c == buttonTexts[BTN_EIGHT]) ||

(c == buttonTexts[BTN_NINE]) ||

(c == buttonTexts[BTN_DECIMAL]));

}

public boolean isNonZeroNumber(char c) {

return (c == buttonTexts[BTN_ONE] ||

c == buttonTexts[BTN_TWO] ||

c == buttonTexts[BTN_THREE] ||

c == buttonTexts[BTN_FOUR] ||

c == buttonTexts[BTN_FIVE] ||

c == buttonTexts[BTN_SIX] ||

c == buttonTexts[BTN_SEVEN] ||

c == buttonTexts[BTN_EIGHT] ||

c == buttonTexts[BTN_NINE]);

}

public static void main(String[] args) {

}

}

测试类:

public class TestCalculator {

public static void main(String[] args) {

ImagePanel panel = new ImagePanel(new ImageIcon("01_Crane_AGweb.jpg").getImage());

SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();

JFrame frame = new JFrame("Simple Arithmetic Calculator");

frame.setResizable(false);

frame.getContentPane().add(panel);

frame.getContentPane().add(calc);

**frame.setPreferredSize(new Dimension(343,343));**

frame.pack();

frame.setVisible(true);

**frame.setMinimumSize(new Dimension(343,371));**

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

panel.setVisible(true);

panel.setOpaque(true);

panel.add(calc);

calc.SetColors(null , Color.white , new Color(72,61,139));

calc.setVisible(true);

calc.setOpaque(false);

}

}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {

this(new ImageIcon(img).getImage());

}

public ImagePanel(Image img) {

this.img = img;

Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));

this.setPreferredSize(new Dimension(size));

this.setMinimumSize(new Dimension(size));

this.setMaximumSize(new Dimension(size));

this.setSize(new Dimension(size));

**this.setLayout(null);**

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(img, 0, 0, this.getWidth(),this.getHeight(),this);

}

}

最佳答案

框架有边框。如果做得正确,pack 将尝试创建一个可视区域(框架边框内的空间)以匹配内容 Pane 的首选大小。

不用担心框架的大小,而是让两个组件和布局管理器自己决定......

Before

第一个值是图像面板/图像的大小,第二个值是窗口的大小。

确保您始终在调用 pack 之前调用 setResizing...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Window;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestCalculator {

public static void main(String[] args) {
ImagePanel panel = new ImagePanel(new ImageIcon("/path/to/image").getImage());
JFrame frame = new JFrame("Simple Arithmetic Calculator");
frame.getContentPane().add(panel);

frame.setResizable(false);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
g.setColor(Color.WHITE);
FontMetrics fm = g.getFontMetrics();
Window window = SwingUtilities.getWindowAncestor(this);
int y = fm.getAscent();
g.drawString(getWidth() + "x" + getHeight() + "; " + window.getWidth() + "x" + window.getHeight(), 0, y);
}
}

使用简单的布局示例进行更新

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Window;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class TestCalculator {

public static void main(String[] args) {
new TestCalculator();
}

public TestCalculator() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

ImagePanel panel = new ImagePanel(new ImageIcon("/path/to/image").getImage());
panel.add(new Calculator());
JFrame frame = new JFrame("Simple Arithmetic Calculator");
frame.getContentPane().add(panel);

frame.setResizable(false);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}

public class Calculator extends JPanel {

public Calculator() {
setOpaque(false);
setLayout(new BorderLayout());

add(new JTextField(), BorderLayout.NORTH);

JPanel keysPane = new JPanel(new GridLayout(5, 4, 8, 8));
keysPane.setBorder(new EmptyBorder(4, 0, 0, 4));
keysPane.setOpaque(false);
String keys[] = new String[]{
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "^", "+",
"C", "%", "<", "=",
};
for (String key : keys) {
keysPane.add(new JButton(key));
}
add(keysPane);
}

}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
this.setPreferredSize(new Dimension(size));
setLayout(new BorderLayout());
setBorder(new EmptyBorder(16, 16, 16, 16));
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
g.setColor(Color.WHITE);
FontMetrics fm = g.getFontMetrics();
Window window = SwingUtilities.getWindowAncestor(this);
int y = fm.getAscent();
g.drawString(getWidth() + "x" + getHeight() + "; " + window.getWidth() + "x" + window.getHeight(), 0, y);
}
}

}

从扩展示例更新

做事的顺序非常重要。一般来说,您想要初始化界面,添加所有需要的组件,打包框架并使其可见......

这通常不是您正在做的事情。而不是做类似的事情......

ImagePanel panel = new ImagePanel(new ImageIcon("01_Crane_AGweb.jpg").getImage());
SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();

JFrame frame = new JFrame("Simple Arithmetic Calculator");

frame.setResizable(false);
// This is not going to come out well, as BorderLayout
// will only allow a single component to occupy the CenterPosition
frame.getContentPane().add(panel);
frame.getContentPane().add(calc);
frame.setPreferredSize(new Dimension(343,343));
// Now sized to the preferred size of the calc pane...
frame.pack();
frame.setVisible(true);
frame.setMinimumSize(new Dimension(343,371));
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
// Rather pointless as Swing components are visible by default...
panel.setVisible(true);
panel.setOpaque(true);
// This is now going to change the preferred size of the window...
panel.add(calc);

你可以做一些更像......的事情

ImagePanel panel = new ImagePanel(new ImageIcon("01_Crane_AGweb.jpg").getImage());
SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();

JFrame frame = new JFrame("Simple Arithmetic Calculator");

panel.setVisible(true);
panel.setOpaque(true);
panel.add(calc);
frame.getContentPane().add(panel);

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);

相反...

完整运行示例...

Calc

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCalculator100 {

public static void main(String[] args) {
new TestCalculator100();
}

public TestCalculator100() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

ImagePanel panel = new ImagePanel(new ImageIcon("01_Crane_AGweb.jpg").getImage());

SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();
calc.setOpaque(false);
panel.add(calc);

JFrame frame = new JFrame("Simple Arithmetic Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);

}

});
}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {

this(new ImageIcon(img).getImage());

}

public ImagePanel(Image img) {

this.img = img;

Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
}

@Override
public void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);

}
}

public static class SimpleArithmeticCalculator extends JPanel implements ActionListener {

private static final int BTN_ONE = 0;

private static final int BTN_TWO = 1;

private static final int BTN_THREE = 2;

private static final int BTN_DIV = 3;

private static final int BTN_FOUR = 4;

private static final int BTN_FIVE = 5;

private static final int BTN_SIX = 6;

private static final int BTN_MULT = 7;

private static final int BTN_SEVEN = 8;

private static final int BTN_EIGHT = 9;

private static final int BTN_NINE = 10;

private static final int BTN_MINUS = 11;

private static final int BTN_ZERO = 12;

private static final int BTN_DECIMAL = 13;

private static final int BTN_POWER = 14;

private static final int BTN_PLUS = 15;

private static final int BTN_CLEAR = 16;

private static final int BTN_PERCENT = 17;

private static final int BTN_BACKSPACE = 18;

private static final int BTN_CALC = 19;

private static final int NUM_BUTTONS = 20;

private static final int OP_MULT = 0;

private static final int OP_DIV = 1;

private static final int OP_PLUS = 2;

private static final int OP_MINUS = 3;

private static final int OP_POWER = 4;

private static final int OP_PERCENT = 5;

private static char[] buttonTexts = {'7', '8', '9', '/', '4',
'5', '6', '*', '1', '2',
'3', '-', '0', '.', '^',
'+', 'C', '%', '<', '='};

private static final int[] buttonKeys = {
KeyEvent.VK_NUMPAD7, KeyEvent.VK_NUMPAD8, KeyEvent.VK_NUMPAD9, KeyEvent.VK_DIVIDE, KeyEvent.VK_NUMPAD4,
KeyEvent.VK_NUMPAD5, KeyEvent.VK_NUMPAD6, KeyEvent.VK_MULTIPLY, KeyEvent.VK_NUMPAD1, KeyEvent.VK_NUMPAD2,
KeyEvent.VK_NUMPAD3, KeyEvent.VK_MINUS, KeyEvent.VK_NUMPAD0, KeyEvent.VK_STOP, '^',
KeyEvent.VK_PLUS, KeyEvent.VK_C, '%', KeyEvent.VK_BACK_SPACE, KeyEvent.VK_ENTER
};

private Font font;

private JButton[] buttons;

private JTextField displayText;

public JPanel calcPanel;

private JPanel textPanel;

private JPanel buttonPanel;

private String buffer;

private int op;

private int opStored;

private double lhs;

private double rhs;

private double rhsStored;

private boolean left;

private boolean clear;

private char lastAction;

public SimpleArithmeticCalculator() {

super();

buffer = new String("0.0");

op = -1;

opStored = -1;

lhs = 0.0;

rhs = 0.0;

rhsStored = 0.0;

left = true;

clear = true;

lastAction = '=';

font = Font.decode("Courier PLAIN 24");

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

}

calcPanel = new JPanel();
calcPanel.setOpaque(false);

textPanel = new JPanel();
textPanel.setOpaque(false);

buttonPanel = new JPanel();
buttonPanel.setOpaque(false);

textPanel.setLayout(new GridLayout(1, 1, 0, 0));

buttonPanel.setLayout(new GridLayout(5, 10, 10, 10));

displayText = new JTextField("", 20);

displayText.setHorizontalAlignment(JTextField.RIGHT);

displayText.setFont(font);

displayText.setEditable(false);

textPanel.add(displayText);

buttons = new JButton[NUM_BUTTONS];

for (int i = 0; i < NUM_BUTTONS; ++i) {

buttons[i] = new JButton("" + buttonTexts[i]);

buttons[i].setMnemonic(buttonKeys[i]);

buttons[i].setFont(font);

buttons[i].setMinimumSize(new Dimension(50, 50));

buttons[i].setActionCommand("" + buttonTexts[i]);

buttons[i].addActionListener(this);

buttonPanel.add(buttons[i]);

}

buttons[BTN_POWER].setText("^");

buttons[BTN_PERCENT].setText("%");

buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

textPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

calcPanel.setLayout(new BorderLayout());

calcPanel.add(textPanel, BorderLayout.NORTH);

calcPanel.add(buttonPanel, BorderLayout.CENTER);

add(calcPanel);

for (int i = 0; i < NUM_BUTTONS; ++i) {

buttons[i].setMaximumSize(buttons[i].getSize());

}

}

public void SetColors(Color bg, Color textbg, Color textcolor) {

calcPanel.setBackground(bg);

calcPanel.setVisible(true);

calcPanel.setOpaque(false);

buttonPanel.setBackground(bg);

buttonPanel.setVisible(true);

buttonPanel.setOpaque(false);

textPanel.setBackground(bg);

textPanel.setOpaque(false);

textPanel.setVisible(true);

displayText.setBackground(textbg);

displayText.setForeground(textcolor);

for (int i = 0; i < NUM_BUTTONS; ++i) {

buttons[i].setForeground(textcolor);

}

}

public void actionPerformed(ActionEvent ev) {

String action = ev.getActionCommand();

char c = action.charAt(0);

boolean calc = false;

if (c == buttonTexts[BTN_CLEAR]) {

buffer = "";

left = true;

} else if (c == buttonTexts[BTN_BACKSPACE]) {

if (buffer.length() > 0) {

buffer = buffer.substring(0, buffer.length() - 1);

}

if (lastAction == buttonTexts[BTN_CALC]) {

left = true;

}

clear = false;

} else if ((c == buttonTexts[BTN_CALC]) || isOpCharacter(c)) {

int opCurrent = op;

if (c == buttonTexts[BTN_CALC]) {

if (!left) {

calc = true;

if (isOpCharacter(lastAction)) {

rhs = GetBufferValue();

rhsStored = rhs;

opCurrent = op;

opStored = op;

} else if (lastAction == buttonTexts[BTN_CALC]) {

rhs = rhsStored;

opCurrent = opStored;

} else {

rhs = GetBufferValue();

rhsStored = rhs;

opCurrent = op;

opStored = op;

}

}

} else if (isOpCharacter(c)) {

opStored = op;

if (c == buttonTexts[BTN_MULT]) {
op = OP_MULT;
}

if (c == buttonTexts[BTN_DIV]) {
op = OP_DIV;
}

if (c == buttonTexts[BTN_PLUS]) {
op = OP_PLUS;
}

if (c == buttonTexts[BTN_MINUS]) {
op = OP_MINUS;
}

if (c == buttonTexts[BTN_POWER]) {
op = OP_POWER;
}

if (c == buttonTexts[BTN_PERCENT]) {
op = OP_PERCENT;
}

if (lastAction == buttonTexts[BTN_CALC]) {

lhs = GetBufferValue();

clear = true;

} else if (isOpCharacter(lastAction)) {

} else {

if (left) {

lhs = GetBufferValue();

left = false;

} else {

calc = true;

rhs = GetBufferValue();

opCurrent = opStored;

opStored = op;

}

clear = true;

}

}

if (calc) {

double result = 0.0;

if (opCurrent == OP_MULT) {
result = lhs * rhs;
}

if (opCurrent == OP_DIV) {
result = lhs / rhs;
}

if (opCurrent == OP_PLUS) {
result = lhs + rhs;
}

if (opCurrent == OP_MINUS) {
result = lhs - rhs;
}

if (opCurrent == OP_POWER) {
result = Math.pow(lhs, rhs);
}

if (opCurrent == OP_PERCENT) {
result = lhs / 100;
}

lhs = result;

buffer = "" + result;

clear = true;

}

} else {

if (lastAction == buttonTexts[BTN_CALC]) {

left = true;

}

if (clear) {

buffer = "";

clear = false;

}

if (c == buttonTexts[BTN_DECIMAL]) {

if (buffer.indexOf('.') == -1) {

if (buffer.length() == 0 || (buffer.length() == 1 && buffer.charAt(0) == '-')) {

buffer += "0";

}

buffer += ".";

}

} else if (c == buttonTexts[BTN_ZERO]) {

if (buffer.length() == 0 || (buffer.length() == 1 && buffer.charAt(0) == '-')) {

buffer += "0.";

} else if (buffer.length() > 0 && (isNonZeroNumber(buffer.charAt(0))
|| (buffer.charAt(0) == '-' && isNonZeroNumber(buffer.charAt(1))))) {

buffer += "0";

} else if (buffer.compareTo("0") == 0 || buffer.compareTo("-0") == 0) {

} else {

buffer += "0";

}

} else {

if (!buffer.equals("0") && !buffer.equals("-0")) {

buffer += c;

}

}

}

lastAction = c;

displayText.setText(buffer);

}

public double GetBufferValue() {

double d = 0.0;

try {

d = Double.parseDouble(buffer);

} catch (NumberFormatException e) {

System.out.println("NumberFormatException in GetBufferValue()");

}

return d;

}

public boolean isOpCharacter(char c) {

return ((c == buttonTexts[BTN_MULT])
|| (c == buttonTexts[BTN_DIV])
|| (c == buttonTexts[BTN_PLUS])
|| (c == buttonTexts[BTN_MINUS])
|| (c == buttonTexts[BTN_POWER])
|| (c == buttonTexts[BTN_PERCENT]));

}

public boolean isNumericCharacter(char c) {

return ((c == buttonTexts[BTN_ZERO])
|| (c == buttonTexts[BTN_ONE])
|| (c == buttonTexts[BTN_TWO])
|| (c == buttonTexts[BTN_THREE])
|| (c == buttonTexts[BTN_FOUR])
|| (c == buttonTexts[BTN_FIVE])
|| (c == buttonTexts[BTN_SIX])
|| (c == buttonTexts[BTN_SEVEN])
|| (c == buttonTexts[BTN_EIGHT])
|| (c == buttonTexts[BTN_NINE])
|| (c == buttonTexts[BTN_DECIMAL]));

}

public boolean isNonZeroNumber(char c) {

return (c == buttonTexts[BTN_ONE]
|| c == buttonTexts[BTN_TWO]
|| c == buttonTexts[BTN_THREE]
|| c == buttonTexts[BTN_FOUR]
|| c == buttonTexts[BTN_FIVE]
|| c == buttonTexts[BTN_SIX]
|| c == buttonTexts[BTN_SEVEN]
|| c == buttonTexts[BTN_EIGHT]
|| c == buttonTexts[BTN_NINE]);

}

}
}

关于java - frame.setResizable(false) 不起作用!它改变窗口大小而不是保持尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20463519/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com