如何在 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);
问候
我使用 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);
问候