zoukankan      html  css  js  c++  java
  • javafx Hanoi

    Netbean  java8    source code  :http://files.cnblogs.com/files/rojas/HNT.zip

    screenshot:

    1  model 

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package hnt.model;
    
    /**
     *
     * @author yang 
     */
    public class Pan {
    
        private String ptag;
        private double psize;
    
        public Pan(String ptag, double psize) {
            this.ptag = ptag;
            this.psize = psize;
        }
    
        /**
         * @return the ptag
         */
        public String getPtag() {
            return ptag;
        }
    
        /**
         * @param ptag the ptag to set
         */
        public void setPtag(String ptag) {
            this.ptag = ptag;
        }
    
        /**
         * @return the psize
         */
        public double getPsize() {
            return psize;
        }
    
        /**
         * @param psize the psize to set
         */
        public void setPsize(double psize) {
            this.psize = psize;
        }
    
    }

    2 common logic

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package hnt.control;
    
    import hnt.model.Pan;
    import java.util.Stack;
    
    /**
     *
     * @author yang
     */
    public class Logic {
    
        public void setNewPole(Stack<Pan> pole, int capcity) {
            int i = capcity - 1;
            while (i >= 0) {
                pole.push(new Pan("p" + i, i * 20 + 100));
                i--;
            }
        }
    
        public int MovePan(Stack<Pan> soruce, Stack<Pan> target) {
    
            if (soruce.size() == 0) {
                return 0;
            }
    
            if (target.size() == 0) {
                target.push(soruce.pop());
                return 1;
            } else {
                Pan pans = soruce.peek();
                Pan pant = target.peek();
                if (CheckSize(pans, pant)) {
                    target.push(soruce.pop());
                    return 1;
                }
                return 0;
            }
    
        }
    
        private boolean CheckSize(Pan pans, Pan pant) {
            boolean canMove = false;
    
            if (pans.getPsize() < pant.getPsize()) {
                canMove = true;
            }
            return canMove;
        }
    
    }

    3 call point

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package hnt;
    
    import java.io.IOException;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    /**
     *
     * @author yang
     */
    public class HNT extends Application {
        
        @Override
        public void start(Stage primaryStage) throws IOException {
     
            FXMLLoader loader=new FXMLLoader();
            loader.setLocation(HNT.class.getResource("/hnt/showHNT.fxml"));
            BorderPane bp= loader.load();
            
            ShowHNTController shnt=  loader.getController();
            //shnt.doinitialize();
            
            StackPane root = new StackPane();
            root.getChildren().add(bp);
            
            Scene scene = new Scene(root, 650, 550);
            
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
        
    }

    4 control

     /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package hnt;
    
    import hnt.control.Logic;
    import hnt.model.Pan;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.ResourceBundle;
    import java.util.Stack;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TextField;
    
    /**
     * FXML Controller class
     *
     * @author yang
     */
    public class ShowHNTController implements Initializable {
    
        Logic l = new Logic();
        Stack<Pan> source = new Stack<>();
        Stack<Pan> target = new Stack<>();
    
        private int capcity = 3;
    
        @FXML
        TextField tfcapcity = new TextField("" + getCapcity());
    
        @FXML
        public void handleTextChange(final ActionEvent event) {
    
            TextField tmptf = (TextField) event.getSource();
            //System.out.println("----------------- "+tmptf.getText());
            setCapcity(Integer.parseInt(tmptf.getText()));
            refreshListView();
        }
    
        public void refreshListView() {
    
            Stack<Pan> pole = new Stack();
            l.setNewPole(pole, getCapcity());
    
            obsA = translate2SomeSymbol(pole);
            poleA.setItems(obsA);
    
            selecteditem.add("A");
            obsB.clear();
            obsC.clear();
            mapAear.put("obsA", obsA);
            mapAear.put("obsB", obsB);
            mapAear.put("obsC", obsC);
    
            poleA.setItems(mapAear.get("obsA"));
            poleB.setItems(mapAear.get("obsB"));
            poleC.setItems(mapAear.get("obsC"));
    
            //clear status
            selecteditem = new ArrayList<>();
            source.removeAllElements();
            target.removeAllElements();
    
            System.out.println(" come to refreshListView()");
        }
    
        List<String> selecteditem = new ArrayList<>();
    
        int countMoveTimes = 0;
        @FXML
        Label MoveTimes = new Label("MoveTimes :" + countMoveTimes);
    
        @FXML
        Button A;
    
        @FXML
        Button B;
    
        @FXML
        Button C;
    
        static ObservableList<Button> obsA = FXCollections.observableArrayList();
    
        @FXML
        ListView<Button> poleA = new ListView<>(obsA);
    
        static ObservableList<Button> obsB = FXCollections.observableArrayList();
    
        @FXML
        ListView<Button> poleB = new ListView<>(obsB);
    
        static ObservableList<Button> obsC = FXCollections.observableArrayList();
    
        @FXML
        ListView<Button> poleC = new ListView<>(obsC);
    
        //  String Aear[]={"obsA","obsB","obsC"};   
        static Map<String, ObservableList> mapAear = new HashMap<>();
    
        /**
         * Initializes the controller class.
         */
        @Override
        public void initialize(URL url, ResourceBundle rb) {
    
        //  String Aear[]={"obsA","obsB","obsC"};
            //MoveTimes = new Label("MoveTimes");
            Stack<Pan> pole = new Stack();
            l.setNewPole(pole, getCapcity());
    
            obsA = translate2SomeSymbol(pole);
            poleA.setItems(obsA);
    
            selecteditem.add("A");
    
            mapAear.put("obsA", obsA);
            mapAear.put("obsB", obsB);
            mapAear.put("obsC", obsC);
            System.out.println(" come to ShowHNTController");
        }
    
        //to button
        private ObservableList translate2SomeSymbol(Stack<Pan> pole) {
            ObservableList<Button> obs = FXCollections.observableArrayList();
            int pdelay=pole.size();
            for (Pan pole1 : pole) {
                Button bt = new Button();
                bt.setText(pole1.getPtag());
                bt.setRotate(180);
                bt.setMaxWidth(pole1.getPsize());
                bt.setTranslateX(30);
                obs.add(bt);
            }
    
            return obs;
        }
    
        // to SomeSymbol
        private Stack<Pan> retranslate2SomeSymbol(ObservableList<Button> bts) {
            // ObservableList<Button> obs=FXCollections.observableArrayList();
            Stack<Pan> pole = new Stack<>();
            for (Button bt : bts) {
                Pan p = new Pan(bt.getText(), bt.getWidth());
                pole.add(p);
            }
            return pole;
        }
    
        String buttoncolor = "-fx-base: #b6e7c9;";
    
        public void ChangeColor(String which, String colorstr) {
           // String  buttoncolor="-fx-base: #b6e7c9;";
            for (String key : mapAear.keySet()) {
                if (key.contains(which) && (mapAear.get(key).size() > 0)) {
                    Button bt = (Button) mapAear.get(key).get(mapAear.get(key).size() - 1);
                    bt.setStyle(colorstr);
                }
            }
    
        }
    
        @FXML
        public void handleClick(final ActionEvent event) {
    
            Button bt = (Button) event.getSource();
            //System.out.println("  from which  "+bt.getText()+" width "+bt.getWidth());
    
            if (selecteditem.isEmpty()) {
                selecteditem.add(bt.getText());
                ChangeColor(bt.getText(), buttoncolor);
                return;
            } else {
                if (selecteditem.size() >= 2) {
                    selecteditem.remove(0);
                    selecteditem.add(bt.getText());
                    ChangeColor(bt.getText(), buttoncolor);
                } else {
                    selecteditem.add(bt.getText());
                    ChangeColor(bt.getText(), buttoncolor);
                }
            }
    
            // move action 
            if ((selecteditem.size() > 1) && (!selecteditem.get(0).equals("")) && (!selecteditem.get(0).equals(selecteditem.get(1)))) {
    
                // System.out.println("  selected name  " +obsA.getClass().getName());
                for (String key : mapAear.keySet()) {
                    if (key.contains(selecteditem.get(0))) {
                        source = retranslate2SomeSymbol(mapAear.get(key));
                    }
                    if (key.contains(selecteditem.get(1))) {
                        target = retranslate2SomeSymbol(mapAear.get(key));
                    }
                }
    
                ////===============
                l.MovePan(source, target);
    
                for (String key : mapAear.keySet()) {
                    if (key.contains(selecteditem.get(0))) {
                        mapAear.replace(key, translate2SomeSymbol(source));
                    }
                    if (key.contains(selecteditem.get(1))) {
                        mapAear.replace(key, translate2SomeSymbol(target));
                    }
                }
                ChangeColor(bt.getText(), "");
                poleA.setItems(mapAear.get("obsA"));
                poleB.setItems(mapAear.get("obsB"));
                poleC.setItems(mapAear.get("obsC"));
    
                //MoveTimes =new Label("MoveTimes");
                countMoveTimes += 1;
                MoveTimes.setText("MoveTimes:" + countMoveTimes);
    
                //clear status
                selecteditem = new ArrayList<>();
                source.removeAllElements();
                target.removeAllElements();
            }
    
        }
    
        /**
         * @return the capcity
         */
        public int getCapcity() {
            return capcity;
        }
    
        /**
         * @param capcity the capcity to set
         */
        public void setCapcity(int capcity) {
            this.capcity = capcity;
        }
    
    }

    5 FXML

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.geometry.*?>
    <?import javafx.scene.text.*?>
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    
    <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="hnt.ShowHNTController">
       <bottom>
          <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="100.0" BorderPane.alignment="CENTER">
             <children>
                <Button fx:id="A" minHeight="20.0" minWidth="20.0" mnemonicParsing="false" onAction="#handleClick" prefHeight="23.0" prefWidth="100.0" text="A" />
                <Button fx:id="B" mnemonicParsing="false" onAction="#handleClick" prefHeight="23.0" prefWidth="100.0" text="B" />
                <Button fx:id="C" mnemonicParsing="false" onAction="#handleClick" prefHeight="23.0" prefWidth="100.0" text="C" />
             </children>
          </HBox>
       </bottom>
       <center>
          <HBox prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
             <children>
                <ListView fx:id="poleA" prefHeight="200.0" prefWidth="200.0" rotate="180.0" />
                <ListView fx:id="poleB" prefHeight="200.0" prefWidth="200.0" rotate="180.0" />
                <ListView fx:id="poleC" prefHeight="200.0" prefWidth="200.0" rotate="180.0" />
             </children>
          </HBox>
       </center>
       <top>
          <VBox prefHeight="52.0" prefWidth="600.0" BorderPane.alignment="CENTER">
             <children>
                <Label alignment="CENTER" prefHeight="15.0" prefWidth="600.0" text="HNT" textAlignment="CENTER">
                   <font>
                      <Font size="27.0" />
                   </font>
                </Label>
                <HBox prefHeight="100.0" prefWidth="200.0" spacing="10.0">
                   <children>
                      <Label fx:id="MoveTimes" prefHeight="15.0" prefWidth="365.0" text="Move Times">
                         <padding>
                            <Insets left="20.0" />
                         </padding>
                      </Label>
                      <Label prefHeight="15.0" prefWidth="42.0" text="Capcity:" />
                      <TextField fx:id="tfcapcity" onAction="#handleTextChange" text="3">
                         <HBox.margin>
                            <Insets />
                         </HBox.margin>
                         <padding>
                            <Insets bottom="10.0" />
                         </padding>
                      </TextField>
                   </children>
                </HBox>
             </children>
          </VBox>
       </top>
    </BorderPane>
  • 相关阅读:
    rest webapi 返回数据
    下载指定路径的文件到本地服务器
    NPOI excel文件解析
    (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
    关于DOM的理解
    (Demo分享)利用JavaScript(JS)做一个可输入分钟的倒计时钟功能
    关于闭包函数和递归函数的详细理解
    纯CSS制作加<div>制作动画版哆啦A梦
    冒泡排序
    Python常用模块及正则表达式知识点,你需要了解的全在这了
  • 原文地址:https://www.cnblogs.com/rojas/p/4735604.html
Copyright © 2011-2022 走看看