I learned Java last semester, and the teacher assigned a homework - write a simple calculator with JavaFx, after many revisions, from 1.0 to 4.0, I managed to get by, although there are some small mistakes in it, but I don't think about it now Go change it... let's do it first.
code show as below
package Task2;
import static java. lang. Math. round;
import javafx. application. Application;
import static javafx. application. Application. launch;
import javafx. event. ActionEvent;
import javafx. event. EventHandler;
import javafx. geometry. HPos;
import javafx. geometry. Insets;
import javafx. geometry. Pos;
import javafx. scene. Scene;
import javafx. scene. control. Button;
import javafx. scene. control. Label;
import javafx. scene. control. TextField;
import javafx. scene. image. Image;
import javafx. scene. layout. Border;
import javafx. scene. layout. GridPane;
import javafx. scene. text. Font;
import javafx. stage. Stage;
public class Counter4 extends Application implements EventHandler < ActionEvent> {
Button[ ] btn = new Button [ 20 ] ;
TextField txt, txt2;
String input;
double [ ] num = new double [ 10 ] ;
char [ ] ops = new char [ 8 ] ;
int count= 0 ;
int start= 0 ;
double res= 0 ;
int len;
String myop = "%+-x/" ;
public static void main ( String[ ] args) {
launch ( args) ;
}
@Override
public void start ( Stage stage) {
GridPane root = new GridPane ( ) ;
root. setStyle ( "-fx-background-color:linear-gradient(to bottom right,#ff33aa,#ffff00)" ) ;
root. setPadding ( new Insets ( 2 , 1 , 8 , 1 ) ) ;
root. setAlignment ( Pos. BOTTOM_CENTER) ;
root. setHgap ( 1 ) ;
root. setVgap ( 2 ) ;
Font font = new Font ( "Arial" , 16 ) ;
txt = new TextField ( ) ;
txt. setFont ( font) ;
txt. setAlignment ( Pos. TOP_RIGHT) ;
txt. setEditable ( false ) ;
txt. setBorder ( Border. EMPTY) ;
txt2 = new TextField ( ) ;
txt2. setFont ( Font. font ( 18 ) ) ;
txt2. setAlignment ( Pos. CENTER_RIGHT) ;
txt2. setEditable ( false ) ;
txt2. setPromptText ( "result" ) ;
GridPane. setColumnSpan ( txt, 4 ) ;
GridPane. setColumnSpan ( txt2, 4 ) ;
GridPane. setMargin ( txt, new Insets ( 0 , 0 , 3 , 0 ) ) ;
root. add ( txt, 0 , 0 ) ;
root. add ( txt2, 0 , 1 ) ;
Label lab = new Label ( "@hcf" ) ;
root. add ( lab, 3 , 7 ) ;
GridPane. setHalignment ( lab, HPos. RIGHT) ;
int num = 8 ;
for ( int row= 3 ; row< 6 ; row++ ) {
for ( int col= 0 ; col< 3 ; col++ ) {
btn[ num] = new Button ( String. valueOf ( num+ 1 ) ) ;
btn[ num] . setPrefSize ( 80 , 50 ) ;
btn[ num] . setFont ( font) ;
root. add ( btn[ num] , col, row) ;
btn[ num] . setOnAction ( this ) ;
num-- ;
}
}
num = 9 ;
String[ ] tag = {
"M" , "del" , "C" , "%" , "0" , "." , "=" , "/" , "+" , "-" , "x" } ;
for ( int j= 0 ; j< 4 ; j++ ) {
btn[ num] = new Button ( tag[ j] ) ;
btn[ num+ 1 ] = new Button ( tag[ j+ 4 ] ) ;
btn[ num] . setPrefSize ( 80 , 50 ) ;
btn[ num+ 1 ] . setPrefSize ( 80 , 50 ) ;
btn[ num] . setFont ( font) ;
btn[ num+ 1 ] . setFont ( font) ;
root. add ( btn[ num] , j, 2 ) ;
root. add ( btn[ num+ 1 ] , j, 6 ) ;
btn[ num] . setOnAction ( this ) ;
btn[ num+ 1 ] . setOnAction ( this ) ;
num = num+ 2 ;
}
for ( int i= 3 ; i< 6 ; i++ ) {
btn[ num] = new Button ( tag[ i+ 5 ] ) ;
root. add ( btn[ num] , 3 , i) ;
btn[ num] . setPrefSize ( 80 , 50 ) ;
btn[ num] . setFont ( font) ;
btn[ num] . setOnAction ( this ) ;
num++ ;
}
Scene scene = new Scene ( root, 330 , 400 ) ;
stage. setScene ( scene) ;
stage. setTitle ( "Counter4.0" ) ;
stage. getIcons ( ) . add ( new Image ( "Counter.jpg" ) ) ;
stage. setResizable ( false ) ;
stage. show ( ) ;
}
@Override
public void handle ( ActionEvent event) {
Button btnClicked= ( Button) event. getSource ( ) ;
String op= btnClicked. getText ( ) ;
switch ( op) {
case "0" :
len = txt. getText ( ) . length ( ) ;
if ( txt. getText ( start, len) . equals ( "0" ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "0" ) ; break ;
case "1" :
txt. setText ( txt. getText ( ) + "1" ) ; break ;
case "2" :
txt. setText ( txt. getText ( ) + "2" ) ; break ;
case "3" :
txt. setText ( txt. getText ( ) + "3" ) ; break ;
case "4" :
txt. setText ( txt. getText ( ) + "4" ) ; break ;
case "5" :
txt. setText ( txt. getText ( ) + "5" ) ; break ;
case "6" :
txt. setText ( txt. getText ( ) + "6" ) ; break ;
case "7" :
txt. setText ( txt. getText ( ) + "7" ) ; break ;
case "8" :
txt. setText ( txt. getText ( ) + "8" ) ; break ;
case "9" :
txt. setText ( txt. getText ( ) + "9" ) ; break ;
case "." :
len = txt. getText ( ) . length ( ) ;
if ( txt. getText ( len- 1 , len) . equals ( "." ) || len== 0 ) {
break ;
}
else if ( txt. getText ( start, len) . indexOf ( "." ) != - 1 ) {
break ;
}
else {
txt. setText ( txt. getText ( ) + "." ) ;
} break ;
case "C" :
txt. setText ( "" ) ; break ;
case "del" :
len = txt. getText ( ) . length ( ) ;
if ( len== 0 )
break ;
txt. setText ( txt. getText ( 0 , len- 1 ) ) ; break ;
case "M" : / / 将得到的结果变成下次计算的数值
txt. setText ( txt2. getText ( ) ) ;
txt2. setText ( "" ) ; break ;
case "/" :
len = txt. getText ( ) . length ( ) ;
if ( len== 0 ) break ;
else if ( myop. contains ( txt. getText ( len- 1 , len) ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "/" ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
start= len+ 1 ;
ops[ count] = '/' ;
count++ ; break ;
case "x" :
if ( len== 0 )
break ;
len = txt. getText ( ) . length ( ) ;
if ( myop. contains ( txt. getText ( len- 1 , len) ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "x" ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
start= len+ 1 ;
ops[ count] = '*' ;
count++ ; break ;
case "+" :
len = txt. getText ( ) . length ( ) ;
if ( len== 0 )
break ;
if ( myop. contains ( txt. getText ( len- 1 , len) ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "+" ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
start= len+ 1 ;
ops[ count] = '+' ;
count++ ; break ;
case "-" :
len = txt. getText ( ) . length ( ) ;
if ( len== 0 )
break ;
if ( myop. contains ( txt. getText ( len- 1 , len) ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "-" ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
start= len+ 1 ;
ops[ count] = '-' ;
count++ ; break ;
case "%" :
len = txt. getText ( ) . length ( ) ;
if ( len== 0 )
break ;
if ( myop. contains ( txt. getText ( len- 1 , len) ) ) {
break ;
}
txt. setText ( txt. getText ( ) + "%" ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
start= len+ 1 ;
ops[ count] = '%' ;
count++ ; break ;
case "=" :
len = txt. getText ( ) . length ( ) ;
num[ count] = Double. valueOf ( txt. getText ( start, len) ) ;
for ( int i= 0 ; i< count; i++ ) {
if ( ops[ i] == '*' ) {
num[ i+ 1 ] = num[ i] * num[ i+ 1 ] ;
num[ i] = 0 ;
ops[ i] = '+' ;
if ( i> 0 && ops[ i- 1 ] == '-' ) {
ops[ i] = '-' ;
}
}
else if ( ops[ i] == '/' ) {
if ( num[ i+ 1 ] == 0 ) {
break ;
}
num[ i+ 1 ] = num[ i] / num[ i+ 1 ] ;
ops[ i] = '+' ;
num[ i] = 0 ;
if ( i> 0 && ops[ i- 1 ] == '-' ) {
ops[ i] = '-' ;
}
}
else if ( ops[ i] == '%' ) {
num[ i+ 1 ] = round ( num[ i] ) % round ( num[ i+ 1 ] ) ;
ops[ i] = '+' ;
num[ i] = 0 ;
if ( i> 0 && ops[ i- 1 ] == '-' ) {
ops[ i] = '-' ;
}
}
}
res= num[ 0 ] ;
for ( int j= 0 ; j< count; j++ ) {
if ( ops[ j] == '+' ) {
res+= num[ j+ 1 ] ;
}
else {
res-= num[ j+ 1 ] ;
}
}
txt2. setText ( String. valueOf ( res) ) ;
for ( int a= 0 ; a< count; a++ ) {
num[ a] = 0 ;
ops[ a] = '\0' ;
}
num[ count] = 0 ;
count= 0 ;
res= 0 ;
start= 0 ;
break ;
default : break ;
}
}
}
operation result
Small thought : Actually, I personally like to make GUI interface. Although the process is very troublesome, the effect is still very good!