frame.setResizable(false);
在我的TestCalculator类中,我的计算器类的JFrame不可复制(不是单词),但它在框架内,底部和右侧添加了一些像素......或者从一个或两个面板中删除一些像素。我不确切知道如何说出来,但是我想让框架成为一个固定的尺寸而没有额外的像素和垃圾。
是的,我确实在另一个网站上询问过,但他们无法帮助我,这是明天早上到期的,我已经工作了大约两个星期,并且昨天让计算器工作了。我一直在谷歌上搜索它,找不到具体的解决方案。
我不确定究竟是什么导致它不能正常行事(呃),但它可能在这段代码中的任何地方,也许是它的顺序,idk。
CALCULATOR CLASS:
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) {
}
}
TEST CLASS:
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);
}
}
答案 0 :(得分:4)
框架有边框。如果完成,pack
将尝试创建可查看区域(框架边框内的空间)以匹配内容窗格的首选大小。
不要担心框架的大小,而是让两个组件和布局管理器自己做出决定......
第一个值是图像面板/图像的大小,第二个值是窗口的大小。
请务必在致电setResizable
...
pack
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);
}
}
使用简单布局示例进行更新
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);
,而不是...
完整运行示例...
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]);
}
}
}
答案 1 :(得分:2)
我在这个网站上只发了三个问题,没有一个专门关于frame.setResizable(false);在此之前!
我知道这是关于setResizable()方法的第一个问题。我说setResizable()方法没有按照你期望的方式工作,因为你的代码都搞砸了,因为你没有听过你过去给出的建议。如果您已经听过建议,那么使用setResizable(false)就不会有问题。
frame.getContentPane().add(panel);
frame.getContentPane().add(calc);
frame.setPreferredSize(new Dimension(358,379));
frame.pack();
...
panel.add(calc);
您可以将“面板”和“计算”添加到内容窗格中。您明确告知JFrame的默认布局是BorderLayout,并且您不能向CENTER添加两个面板(当您未指定约束时这是默认布局)
然后打包()框架并将“calc”添加到“panel”。这正在改变框架中组件的结构。再次告诉你,在执行pack()之前必须将所有组件添加到框架中。
然后给出了关于如何使用带有图像作为背景的面板以及如何将“背景面板”添加到框架并将“计算面板”添加到背景中的建议。所有这些代码都非常简单如您所示,使用适当的布局管理器。
您的代码现在已经搞砸了,因为您正在硬编码各处的首选,最小和最大尺寸。您的尺寸可能会考虑图像的大小,但它们没有考虑标题栏的大小和框架周围的边框,因此setResizable(false)方法无法正常工作。
如果您使用布局管理器,就像您在其他帖子中所展示的那样,您无需在类中的任何位置使用硬代码大小,并且无论您是否使用setRisizable(false),代码都将完全相同。
另外,昨天我告诉你不需要以下陈述:
panel.setVisible(true);
calc.setVisible(true);
因为默认情况下它们已经可见。但你仍然包括这些陈述。现在这不会引起问题,但它只是表明你听我的建议很少。