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>
原文地址:https://www.cnblogs.com/rojas/p/4735604.html