- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个科学计算器程序。我的程序所做的是采用“标签”(用户使用按钮输入的字符串)并计算表达式。我的程序所做的是,一旦单击等号按钮 (button_eq),它就会调用 splitLabel 方法,该方法将标签拆分为数字和运算符的 Arraylist。然后调用brackets在ArrayList中搜索括号,并通过调用calculate方法完成子计算。然而,在我的程序处理更基本的计算(加法、减法)之前,它运行良好。然而,一旦我添加了更复杂的计算,当我单击等于按钮时,程序就会卡住。我想知道这可能是什么问题?
public class CalculatorFrameA {
ActionListener button_eqListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
label2.setText(bracket(splitLabel(label.getText())));
}
};
public ArrayList<String> splitLabel(String val){
ArrayList<String> label_split = new ArrayList<String>();
String value = "";
String op = "";
for (int i = 0; i< val.length(); i++){
boolean isDigit = Character.toString(val.charAt(i)).matches("[0123456789.]+");
boolean isOperator = Character.toString(val.charAt(i)).matches("[+*/^-]+");
boolean isSin = (Character.toString(val.charAt(i)).equals("s") && Character.toString(val.charAt(i+1)).equals("i") && Character.toString(val.charAt(i+2)).equals("n"));
boolean isCos = (Character.toString(val.charAt(i)).equals("c") && Character.toString(val.charAt(i+1)).equals("o") && Character.toString(val.charAt(i+2)).equals("s"));
boolean isTan = (Character.toString(val.charAt(i)).equals("t") && Character.toString(val.charAt(i+1)).equals("a") && Character.toString(val.charAt(i+2)).equals("n"));
boolean isOpBracket = Character.toString(val.charAt(i)).equals("(");
boolean isClBracket = Character.toString(val.charAt(i)).equals(")");
while (isDigit){
value = value + Character.toString(val.charAt(i));
}
if (isOperator && !value.equals("")){
op = Character.toString(val.charAt(i));
label_split.add(value);
label_split.add(op);
op = "";
value = "";
} else if (isOperator && value.equals("")){
if (Character.toString(val.charAt(i)).equals("-")){
value = Character.toString(val.charAt(i));
}
} else if (isSin){
label_split.add("sin");
}else if (isCos){
label_split.add("cos");
}else if (isTan){
label_split.add("tan");
} else if (isOpBracket && !value.equals("")){
label_split.add(value);
label_split.add("(");
value = "";
} else if (isOpBracket && value.equals("")){
label_split.add("(");
} else if (isClBracket && !value.equals("")){
label_split.add(value);
label_split.add(")");
value = "";
}
if (i== val.length()-1 && !value.equals("")){
label_split.add(value);
} else if (i== val.length()-1 && Character.toString(val.charAt(i)).equals(")")){
label_split.add(")");
}
} return label_split;
}
public String bracket(ArrayList<String> label_split){
ArrayList<Integer> opBra = new ArrayList<Integer>();
ArrayList<Integer> clBra = new ArrayList<Integer>();
ArrayList<String> calculation = new ArrayList<String>();
int counter = 0;
int counter1 = 0;
if (label_split.contains("(") && label_split.contains(")")){
for (int j=0; j<label_split.size(); j++){
if (label_split.get(j).equals("(")){
counter = counter + 1;
opBra.add(j);
} else if (label_split.get(j).equals(")")){
counter1 = counter1 + 1;
clBra.add(j);
}
}
if (counter1 != counter){
return "error missing bracket";
} else {
for (int j=opBra.size(); j>0; j--){
int opBraPos = opBra.get(j) + 1; //+1 and -1 so it doesn't include ()
int clBraPos = clBra.get(opBra.size()-j) - 1;
opBra.remove(j);
clBra.remove(opBra.size()-j);
for(int t = 0; t < (clBraPos - opBraPos); t++){
calculation.add(label_split.get(t+opBraPos));
}
String value = calculate(calculation);
label_split.set(j , value);
calculation.clear();
for (int n = 0; n < ((clBraPos+1) - opBraPos); n++){
label_split.remove(n);
}
}
}
return calculate(label_split);
} else{
return calculate(label_split);
}
}
public String calculate(ArrayList<String> calculation){
double value = 0.0;
String value1 = "";
boolean isOperator = calculation.contains("[+*/^-]+");
boolean isSin = calculation.contains("sin");
boolean isCos = calculation.contains("cos");
boolean isTan = calculation.contains("tan");
boolean isOpBracket = calculation.contains("(");
boolean isClBracket = calculation.contains(")");
for (int i=0; i < calculation.size(); i++){
if (calculation.get(i).equals("^") && i < calculation.size() && i < 0){
boolean isDigit1 = calculation.get(i-1).matches("[0123456789.-]+");
boolean isDigit2 = calculation.get(i+1).matches("[0123456789.-]+");
if (isDigit1 && isDigit2){
value = Math.pow(Double.parseDouble(calculation.get(i-1)), Double.parseDouble(calculation.get(i+1)));
value1 = Double.toString(value);
calculation.set(i,value1);
calculation.remove(i-1);
calculation.remove(i+1);
}
}
}
for (int a=0; a < calculation.size(); a++){
if ( (calculation.get(a)).equals("sin") && a < calculation.size() && a < 0){
boolean isDigit1 = calculation.get(a+1).matches("[0123456789.-]+");
if (isDigit1){
value = Math.sin(Double.parseDouble(calculation.get(a+1)));
value1 = Double.toString(value);
calculation.set(a,value1);
calculation.remove(a+1);
}
}
}
for (int b=0; b < calculation.size(); b++){
if ( (calculation.get(b)).equals("cos") && b < calculation.size() && b < 0){
boolean isDigit1 = calculation.get(b+1).matches("[0123456789.-]+");
if (isDigit1){
value = Math.cos(Double.parseDouble(calculation.get(b+1)));
value1 = Double.toString(value);
calculation.set(b,value1);
calculation.remove(b+1);
}
}
}
for (int c=0; c < calculation.size(); c++){
if ( (calculation.get(c)).equals("tan") && c < calculation.size() && c < 0){
boolean isDigit1 = calculation.get(c+1).matches("[0123456789.-]+");
if (isDigit1){
value = Math.tan(Double.parseDouble(calculation.get(c+1)));
value1 = Double.toString(value);
calculation.set(c,value1);
calculation.remove(c+1);
}
}
}
for (int d=0; d < calculation.size(); d++){
if (calculation.get(d).equals("*") && d < calculation.size() && d < 0){
boolean isDigit1 = calculation.get(d-1).matches("[0123456789.-]+");
boolean isDigit2 = calculation.get(d+1).matches("[0123456789.-]+");
if (isDigit1 && isDigit2){
value = Double.parseDouble(calculation.get(d-1)) * Double.parseDouble(calculation.get(d+1));
value1 = Double.toString(value);
calculation.set(d,value1);
calculation.remove(d-1);
calculation.remove(d+1);
}
}
}
for (int e=0; e < calculation.size(); e++){
if (calculation.get(e).equals("/") && e < calculation.size() && e < 0){
boolean isDigit1 = calculation.get(e-1).matches("[0123456789.-]+");
boolean isDigit2 = calculation.get(e+1).matches("[0123456789.-]+");
if (isDigit1 && isDigit2){
value = Double.parseDouble(calculation.get(e-1)) / Double.parseDouble(calculation.get(e+1));
value1 = Double.toString(value);
calculation.set(e,value1);
calculation.remove(e-1);
calculation.remove(e+1);
}
}
}
for (int f=0; f < calculation.size(); f++){
if (calculation.get(f).equals("+") && f < calculation.size() && f < 0){
boolean isDigit1 = calculation.get(f-1).matches("[0123456789.-]+");
boolean isDigit2 = calculation.get(f+1).matches("[0123456789.-]+");
if (isDigit1 && isDigit2){
value = Double.parseDouble(calculation.get(f-1)) + Double.parseDouble(calculation.get(f+1));
value1 = Double.toString(value);
calculation.set(f,value1);
calculation.remove(f-1);
calculation.remove(f+1);
}
}
}
for (int g=0; g < calculation.size(); g++){
if (calculation.get(g).equals("-") && g < calculation.size() && g < 0){
boolean isDigit1 = calculation.get(g-1).matches("[0123456789.-]+");
boolean isDigit2 = calculation.get(g+1).matches("[0123456789.-]+");
if (isDigit1 && isDigit2){
value = Double.parseDouble(calculation.get(g-1)) - Double.parseDouble(calculation.get(g+1));
value1 = Double.toString(value);
calculation.set(g,value1);
calculation.remove(g-1);
calculation.remove(g+1);
}
}
}
for (int h=0; h < calculation.size(); h++){
boolean isDigit = calculation.get(h).matches("[0123456789.-]+");
if (isDigit && !isOperator && !isSin && !isCos && !isTan &&!isOpBracket &&!isClBracket){
double value3 = 0.0;
value3 = Double.parseDouble(calculation.get(h));
String value2 = Double.toString(value3);
calculation.set(h,value2);
}
}
return calculation.get(0);
}
public static void main(String[] args) {
CalculatorFrameA g = new CalculatorFrameA();
}
}
public static void main(String[] args) {
CalculatorFrameA g = new CalculatorFrameA();
}
最佳答案
不要将调用包装在常规线程
中,而是使用 Swingutilities。您需要这样做,因为 Swing 不是线程安全的。这样您仍然可以在 EDT 上工作。
SwingUtilities.invokeLater(() -> {
try {
label2.setText(bracket(splitLabel(label.getText())));
} catch (Exception e) {
e.printStackTrace();
}
});
关于Java Swing - 单击按钮后完成计算时 GUI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970045/
我在选项卡中有我的网络应用程序的选项。 aaa bbb ccc ddd eee 当用户单击任何选项卡(在同一窗口中)时,我会使用此代码获得淡出效果,然后自动
如何获得一个简单的调用单击来实现如下功能:http://jsfiddle.net/ftwPS/6/我显然错过了一些基本的东西,因为当您单击“CLICK”时这不起作用。 $('tr').click(fu
我有一个列表,在左侧显示一个插入符号图标,单击它时应该更改图标。每当我单击一个图标时,所有图标都会更改。 detailedInfo = []; subordinateInfo; openSu
我有一个 div,我想对其进行设置,以便当我单击其他内容时,它会隐藏该 div。 我也是这样 $('body').click(function(){ if(loginOpened) {
我有很多装有不同内容的盒子。 如果单击第一个框,您可以看到一个包含更多详细信息的弹出框。如果单击第二个、第三个等框,您必须查看这些框的详细信息。 我的问题:如果我点击框号。 2 我看到了盒子号的详细信
当我点击 .add-btn 时,我将 .add-btn 的样式更改为 background:#cccccc 并将 val() 更改为“-”。 现在当我用 tr td .list 删除添加的文本时,它是
感谢 SO 的出色贡献者!当您开始了解 jQuery 时,它会变得更酷。 :) 所以我有一个 LI,单击时会显示/隐藏子 UL。我想做的是能够单击 LI 内的链接,打开一个空白窗口,但也不会关闭子 U
我有这份文档,它使我能够获得一份带有点击进度的多项选择选择调查问卷。 如何用图像代替此处的文字? (并且仍然有这样的机制,一旦单击[图像],就会提出下一个问题) 我已经尝试使用 UL/H1 设置背景图
我想在 JQGrid 的刷新按钮单击上编写代码。有什么事件吗? 最佳答案 如果您需要在开始刷新之前执行一些操作,您应该使用 beforeRefresh打回来: $("#grid_id").jqGrid
问题是将对象或多个参数从模板传递到组件,并使用它们将数据添加到 API。 任务.service.ts addTasks(task: Task): Observable{ let headers =
我有一个像这样的primefaces选项卡 View : This tab has static content. this t
我在 jquery 中有一个有效的 a.click() 函数...但是如果我单击一个 anchor ,我会打开一个新窗口...但是我怎样才能阻止浏览器本身打开一个新窗口? 示例: $('a')
有没有简单的方法来创建代码:如果 URL 更改或单击链接显示 div(例如加载 gif 3 秒),则显示页面?有点像空白的白色页面,加载 gif 旋转 3 秒然后显示页面? 谢谢! 最佳答案 给定 G
我需要知道此时按钮的状态是否被点击? 谢谢 最佳答案 if (myButton.state & UIControlStateHighlighted) { // Do your stuff the
我正在 NSImageView 上绘制一条 NSBezierPath 线。我正在创建 NSBezierPath 对象,设置 moveToPoint,设置 lineToPoint,设置 setLineW
我的 Selenium 代码存在问题,无法正确执行按键 + 单击操作。 测试应打开 jqueryui.com 链接并选择页面上的前 2 个 li 元素。 我正在使用 Selenium 2.23 和 F
单击时我将更改字符串一部分的样式。例如“TEXT”,然后单击“T”,之后它会将样式从黑色更改为红色,仅 T在我的代码中,当我单击文本时,我拆分文本并保留在“split”数组中,它将调用handleCl
我在网站上有一个 anchor 。当有人点击它时,我在 jquery 中执行一些操作并更改名称,但是当再次单击它时,事件被触发,尽管我已经更改了它的名称。代码在这里: $(".like_cont a[
我有一个下载链接Download我希望每次当有人点击“下载”时,我都可以将其插入数据库total_downloads+1。为了插入数据库,我通常使用 然后 if (isset($_POST['d
我是一名优秀的程序员,十分优秀!