如何在 javaFx 中禁用 pdf reader 上的加载按钮

How can i disable load button on pdf reader in javaFx

我使用 boxPdf 创建了一个 pdf reader。



我的项目包含 4 个 java 文件和 ui.fxml
主文件 (main.java)
控制器 (controller.java)
显示 pdf 文件 class (pdfDisplay.java)
和 pdf 模型 (pdfModel.java).

加载按钮在 controller.java 上实现,当我单击它时,我将加载带有关闭按钮的 pdf 文件。



我的问题是:

如何在显示 pdf 文件时禁用加载按钮,直到我单击关闭按钮?

因为如您所见,在第二张图片中,加载按钮始终处于启用状态,即使显示第一个文件,用户也可以加载另一个文件,这是我不想要的。

另一个答案:

当我关闭显示的 pdf 并加载另一个时,我得到:
Children: duplicate children added: parent = AnchorPane[id=anchor, styleClass=root] 在调试器中


这是我的代码项目

main.java

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *@author toru
 */
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Parent parent = FXMLLoader.load(getClass().getResource("ui.fxml"));
        parent.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setTitle("Vet0b00k5");
        primaryStage.setScene(new Scene(parent,600, 400));
        primaryStage.show();
     }
public static void main(String[] args) {
        launch(args);
    }

}

controller.java

package application;

import java.io.File;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.FileChooser;
import java.nio.file.Path;

public class controller{

     @FXML 
     private AnchorPane anchor = new AnchorPane();
     Button loadButton=new Button ("Load");
     pdfDisplay pdfFileOpened= new pdfDisplay();
     HBox menuLoadB = new HBox (1);
     Path Path;
     PdfModel model= new PdfModel();


    public void initialize(){

        /*this part doesn't work*/
        if(Path==null){
            loadButton.setDisable(false);
            }
            else{
            loadButton.setDisable(true);
            }
        /*this part doesn't work*/

        menuLoadB.getChildren().add(loadButton);
        anchor.getChildren().addAll(menuLoadB);
        loadButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                loadFile();

            }
        });

    }

 void loadFile() {

    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Upload File Path");
    fileChooser.getExtensionFilters().addAll(

    new FileChooser.ExtensionFilter("PDF", "*.pdf"));
    File file = fileChooser.showOpenDialog(anchor.getScene().getWindow());

    if (file != null && file.toPath()!=null) {

        String f=file.getPath();
        pdfFileOpened.setModel(f);
        anchor.getChildren().addAll(pdfFileOpened.affichePDF());

    } else  {
        System.out.println("error"); // or something else
    }

 }
}

pdfDisplayClass.java

package application;

import java.nio.file.Path;
import java.nio.file.Paths;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Pagination;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;


public class pdfDisplay{


         Button xButton=new Button ("X");


         HBox menu = new HBox (1);

         Pagination pagination;
         Path Path;
         PdfModel model= new PdfModel();
         ScrollPane scrollPane = new ScrollPane();
         VBox vboxRoot= new VBox();
         ImageView imageView = new ImageView();



     public VBox createPage(int pageIndex) {


         VBox box = new VBox();
            imageView = new ImageView(model.getImage(pageIndex));
            imageView.setFitWidth(model.afficheLargeur()*1.25);
            imageView.setFitHeight(model.afficheHauteur()*1.25);

                VBox.setMargin(scrollPane, new Insets(10, 50, 10, 50));
                scrollPane.prefHeightProperty().bind(vboxRoot.heightProperty());
                scrollPane.setPannable(true);
                scrollPane.setContent(imageView);
                scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
                scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
                scrollPane.setStyle("-fx-border-color:red;");

                pagination.setStyle("-fx-border-color:black;");
                box.getChildren().add(scrollPane);

                return box;
        }
     void setModel(String f) {
            model= new PdfModel(Paths.get(f));
     }
     Path getModel() {

            return model.getPath();
     }
     VBox affichePDF() {

            pagination = new Pagination();
            pagination.setPageCount(model.nombreDePages());
            pagination.setPageFactory((Integer pageIndex) -> { return createPage(pageIndex);});



            xButtonAction();
           VBox.setMargin(pagination, new Insets(10, 10, 10, 10));
            VBox.setMargin(menu, new Insets(10, 10, 10, 10));

            menu.getChildren().addAll(xButton);
            menu.setStyle("-fx-border-color:yellow;");
            vboxRoot.setStyle("-fx-border-color:yellow;");
            vboxRoot.getChildren().addAll(menu,pagination);

            AnchorPane.setTopAnchor(vboxRoot, 50.0);
            AnchorPane.setRightAnchor(vboxRoot, 10.0);
            AnchorPane.setBottomAnchor(vboxRoot, 40.0);
            AnchorPane.setLeftAnchor(vboxRoot, 40.0);

           return vboxRoot;
        }

     void xButtonAction() {

         xButton.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {

                    fermerFichier();
                }
            });

     }

     void fermerFichier() {
            pagination.setPageFactory( (Integer pageIndex) -> { return null;} );
            menu.getChildren().removeAll(xButton);
            vboxRoot.getChildren().removeAll(menu,pagination);
            model.setPath(null);
            model.fermer();

        }

}

pdfmodel.java

package application;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
//import java.util.logging.Logger;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.rendering.PDFRenderer;

/**
 * @author toru
 */
class PdfModel {
    //private static final Logger logger = Logger.getLogger(PdfModel.class.getName());

    private PDDocument document;
    private PDFRenderer renderer;

    Path chemin;

    PdfModel() {

    }

    PdfModel(Path path) {
        try {
            chemin=path;
            document = PDDocument.load(path.toFile());
            renderer = new PDFRenderer(document);
        } catch (IOException ex) {
            throw new UncheckedIOException("PDDocument thorws IOException file=" + path, ex);
        }
    }

    int nombreDePages() {
        return document.getPages().getCount();
    } 



    void fermer() {
        try {
            document.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    void setPath(Path pPays)
      {
       chemin = pPays;
      }

    Path getPath()
      {
       return chemin;
      }



double afficheHauteur() {

        PDPage page = document.getPage(document.getNumberOfPages() - 1);
         PDRectangle pageSize = page.getMediaBox();

         return pageSize.getHeight();

    }

   double afficheLargeur() {

        PDPage page = document.getPage(document.getNumberOfPages() - 1);
         PDRectangle pageSize = page.getMediaBox();

         return pageSize.getWidth();


    }
    Image getImage(int pageNumber) {
        BufferedImage pageImage;

        try {
            pageImage = renderer.renderImage(pageNumber,3);
        } catch (IOException ex) {
            throw new UncheckedIOException("PDFRenderer throws IOException", ex);
        }
        return SwingFXUtils.toFXImage(pageImage, null);

    }

}

ui.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>

<AnchorPane fx:id="anchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller">
   <children>
      <HBox prefHeight="50.0" prefWidth="400.0" />
   </children>
</AnchorPane>

可以下载my eclipse project and the pdf box

感谢您花时间阅读所有这些

此致

这就是解决方案。

loadButton 必须是静态的。

从另一个 class 访问控制器 loadButton 并将其设置为启用,这是正确的命令

application.controller.loadButton.setDisable(false);

问候