2015-06-27 9 views
0

Я хотел бы использовать панель гридов для печати нескольких страниц. Данные поступают из файла CSV. Может ли кто-нибудь предложить решение? Вот код, который я использовал для печати, у него есть панель грида, которая завернута в область, так как она написана, отображает информацию для печати, а затем нажатием кнопки PRINT информация отправляется на принтер final Printer selectedPrinter = Printer.getDefaultPrinter(); int R = 0; @FXML частная пустота onBuildRpt (ActionEvent е) броски IOException {JavaFX печатает несколько страниц из панели сетки

pane.setVisible(false); 
paneRpt.setVisible(true); 
gpRpt.setVisible(true); 
gpRpt.getChildren().clear(); 
//gpRpt.gridLinesVisibleProperty().set(true); 
gpRpt.setLayoutX(5); 
gpRpt.setLayoutY(10); 

R = 2; 

Text txtH1 = new Text("Hospital Number"); 
GridPane.setHalignment(txtH1, HPos.CENTER); 
txtH1.setFont(Font.font("Times New Roman", FontWeight.BLACK, FontPosture.REGULAR, 14)); 
gpRpt.add(txtH1, 0, 0); 

Text txtH2 = new Text("First Name"); 
GridPane.setHalignment(txtH2, HPos.LEFT); 
txtH2.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));  
gpRpt.add(txtH2, 1, 0); 

Text txtH3 = new Text("Last Name"); 
GridPane.setHalignment(txtH3, HPos.LEFT); 
txtH3.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));  
gpRpt.add(txtH3, 2, 0); 

Text txtH4 = new Text("Room"); 
GridPane.setHalignment(txtH4, HPos.LEFT); 
txtH4.setFont(Font.font("Times New Roman", FontWeight.BLACK, FontPosture.REGULAR, 14)); 
gpRpt.add(txtH4, 3, 0); 

File file = new File("C:/A_Hospital/Patients.csv"); 
Path dirP = Paths.get(String.valueOf(file)); 
InputStream in = Files.newInputStream(dirP); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
//int H =list.size(); 
//System.out.println(H); 
scan = new Scanner(reader); 
scan.useDelimiter("\\s*,\\s*"); 

while (scan.hasNext()){ 
String hospnum = scan.next(); 
String fname = scan.next(); 
String lname = scan.next(); 
String roomnum = scan.next(); 

Text txt1 = new Text(hospnum); 
GridPane.setHalignment(txt1, HPos.CENTER); 
txt1.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt1, 0, R); 

Text txt2 = new Text(fname + " "); 
GridPane.setHalignment(txt2, HPos.LEFT); 
txt2.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt2 , 1, R); 

Text txt3 = new Text(lname); 
GridPane.setHalignment(txt3, HPos.LEFT); 
txt3.setFont(Font.font("Times New Roman", FontWeight.BLACK, FontPosture.REGULAR, 14)); 
gpRpt.add(txt3, 2, R); 

Text txt4 = new Text(roomnum); 
GridPane.setHalignment(txt4, HPos.LEFT); 
txt4.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt4, 3, R); 

Text txtS0 = new Text(" "); 
txtS0.prefHeight(5); 
Text txtS1 = new Text(" "); 
txtS1.prefHeight(5); 
Text txtS2 = new Text(" "); 
txtS2.prefHeight(5); 
Text txtS3 = new Text(" "); 
txtS3.prefHeight(5); 
GridPane.setFillHeight(txtS0, true); 
gpRpt.add(txtS0, 0, R+1); 
GridPane.setFillHeight(txtS1, true); 
gpRpt.add(txtS1, 1, R+1); 
GridPane.setFillHeight(txtS2, true); 
gpRpt.add(txtS2, 2, R+1); 
GridPane.setFillHeight(txtS3, true); 
gpRpt.add(txtS3, 3, R+1); 

R = R + 2; 
//System.out.println(R);//36\f 
} 

scan.close(); 
} 

@FXML 
public void onPrint(ActionEvent e){ 
//gpRpt.gridLinesVisibleProperty().set(true); 
gpRpt.setStyle("-fx-background-color:transparent"); 
print(gpRpt, selectedPrinter); 
} 

public void print(final Node node, Printer printer) { 
PrinterJob job = PrinterJob.createPrinterJob(); 
double lMargin = 0.25; 
double rMargin = 0.25; 
double tMargin = 0.25; 
double bMargin = 0.25; 
PageLayout pageLayout = 
printer.createPageLayout(Paper.NA_LETTER,PageOrientation.PORTRAIT 

, lMargin, rMargin, tMargin, bMargin);

JobSettings jobSettings = job.getJobSettings(); 
jobSettings.setPageLayout(pageLayout); 

//System.out.println(jobSettings); 
//boolean proceed = job.showPageSetupDialog(null); 
boolean printed = job.printPage(node); 
if (printed) { 
// End the printer job 
job.endJob(); 
} 
pane.setVisible(true); 
paneRpt.setVisible(false); 

} 

ответ

0

@James_Duh Добавить два текстовых поля на свою вторую панель (paneRpt). Затем в Scene Builder оберните GridPane (gpRpt) в ScrollPane и добавьте новый столбец в нулевой столбец GridPane, который должен быть только PerfWidth 25. Я переписал ваш метод onBuildRpt, чтобы GridPane отражал все данные в CSV-файле. Теперь GridPane прокручивается, и каждая запись имеет номер строки. Здесь начались забавные запуски, теперь вы можете выбрать номер стартовой строки и номер конечной строки для печати. Я не мог выпустить фид формы, поэтому печать по-прежнему является многоступенчатым процессом. Фактический дизайн печати управляется новым методом printRpt, который вызывается кнопкой Print. Я добавил соответствующий код ниже.

@FXML 
private void onBuildRpt(ActionEvent e) throws IOException { 

if(list.size()==0) { 
Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("No Data for Report\n"+ 
"Select File then Alt + A to Add New Data"); 
alert.showAndWait(); 
return; 
} 

int row = 0; 
togp = new ArrayList<>(); 
pane.setVisible(false); 
paneRpt.setVisible(true); 
gpRpt.setVisible(true); 
gpRpt.getChildren().clear(); 
//gpRpt.gridLinesVisibleProperty().set(true); 
//gpRpt.setLayoutX(20); 
//gpRpt.setLayoutY(10); 

int R = 2; 

File file = new File("C:/A_Hospital/Patients.csv"); 
Path dirP = Paths.get(String.valueOf(file)); 
InputStream in = Files.newInputStream(dirP); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
scan = new Scanner(reader); 
scan.useDelimiter("\\s*,\\s*"); 


while (scan.hasNext()){ 
String hospnum = scan.next(); 
String fname = scan.next(); 
String lname = scan.next(); 
String roomnum = scan.next(); 

togp.add(hospnum); 
togp.add(fname); 
togp.add(lname); 
togp.add(roomnum); 
} 

scan.close(); 

for(int p = 0; p < togp.size(); p++){ 

row = row + 1; 

Text txt0 = new Text(""+row); 
//row number 
GridPane.setHalignment(txt0, HPos.CENTER); 
txt0.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));` 
gpRpt.add(txt0, 0, R); 

Text txt1 = new Text(togp.get(p)); 
//hospnum 
GridPane.setHalignment(txt1, HPos.CENTER); 
txt1.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));` 
gpRpt.add(txt1, 1, R); 

Text txt2 = new Text(togp.get(p=p+1)); 
//fname 
GridPane.setHalignment(txt2, HPos.LEFT); 
txt2.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));` 
gpRpt.add(txt2 , 2, R); 

Text txt3 = new Text(togp.get(p=p+1)); 
//lname 
GridPane.setHalignment(txt3, HPos.LEFT); 
txt3.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));` 
gpRpt.add(txt3, 3, R); 

Text txt4 = new Text(togp.get(p=p+1)); 
//roomnum 
GridPane.setHalignment(txt4, HPos.LEFT); 
txt4.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
`FontPosture.REGULAR, 14));` 
gpRpt.add(txt4, 4, R); 

Text txtS0 = new Text(" "); 
txtS0.prefHeight(5); 
Text txtS1 = new Text(" "); 
txtS1.prefHeight(5); 
Text txtS2 = new Text(" "); 
txtS2.prefHeight(5); 
Text txtS3 = new Text(" "); 
txtS3.prefHeight(5); 
GridPane.setFillHeight(txtS0, true); 
gpRpt.add(txtS0, 0, R+1); 
GridPane.setFillHeight(txtS1, true); 
gpRpt.add(txtS1, 1, R+1); 
GridPane.setFillHeight(txtS2, true); 
gpRpt.add(txtS2, 2, R+1); 
GridPane.setFillHeight(txtS3, true); 
gpRpt.add(txtS3, 3, R+1); 

R = R + 2; 
} 
txfStartRow.requestFocus(); 
} 
@FXML 
private void printRpt() { 
//This method just clears the gpRpt and 
//reloads it with selected row number range 
if(txfStartRow.getText().isEmpty() || txfEndRow.getText().isEmpty()) { 


Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("No Data Entered\n"+ 
"Enter Start Row Number and End Row Number"); 
alert.showAndWait(); 

if(txfStartRow.getText().isEmpty()) { 
    txfStartRow.requestFocus(); 
return; 
} 
if(txfEndRow.getText().isEmpty()) { 
    txfEndRow.requestFocus(); 
return; 
} 
return; 
} 

String regX1 = ("[0-9\\^W]*"); 
String W1 = String.valueOf(txfStartRow.getText().trim()); 
if(!W1.matches(regX1) || Integer.valueOf(W1) > togp.size()/4) { 

Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("Numeric Values Only\n"+ 
"\nAcceptable Rows 1 to "+ togp.size()/4 +" Can Be Entered"); 
alert.showAndWait(); 

txfStartRow.requestFocus();  
return; 
} 

String regX2 = ("[0-9\\^W]*"); 
String W2 = String.valueOf(txfEndRow.getText().trim()); 
if(!W2.matches(regX2) || Integer.valueOf(W2) > togp.size()/4) { 
Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("Numeric Values Only\n"+ 
"\nAcceptable Rows 1 to "+ togp.size()/4 +" Can Be Entered"); 
alert.showAndWait(); 
txfEndRow.requestFocus(); 


return; 
} 

if(Integer.valueOf(txfStartRow.getText()) <= 0 || 
Integer.valueOf(txfEndRow.getText()) <=0) { 
Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("Data Entry Error\n"+ 
"Start & End Rows Can NOT be zero"); 
alert.showAndWait(); 
txfStartRow.setText(""); 
txfEndRow.setText(""); 
txfStartRow.requestFocus(); 
return; 
} 

if(Integer.valueOf(txfEndRow.getText()) - Integer.valueOf 
(txfStartRow.getText()) > 19) { 

Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("Printing Issue\n"+ 
"Max Report Size 20 Rows"); 
alert.showAndWait(); 
//txfStartRow.setText(""); 
//txfEndRow.setText(""); 
txfStartRow.requestFocus(); 
return; 
} 

if(Integer.valueOf(txfStartRow.getText()) > 
Integer.valueOf(txfEndRow.getText())) { 
Alert alert = new Alert(Alert.AlertType.WARNING); 
alert.setTitle("Information"); 
alert.setHeaderText(""); 
alert.setContentText("Data Entry Error\n"+ 
"Start Row Greater than End Row"); 
alert.showAndWait(); 
//txfStartRow.setText(""); 
//txfEndRow.setText(""); 
txfStartRow.requestFocus(); 
return; 
} 

//Fancy Math for Row Calculation to find togp index 
//This should work no matter the size of the togp ArrayList 
int SR = Integer.valueOf(txfStartRow.getText()); 
SR = SR * 3 + SR - 4; 
int ER = Integer.valueOf(txfEndRow.getText()); 
ER = ER * 3 + ER - 3; 

gpRpt.getChildren().clear(); 
int row = 0; 
int R = 2; 

Text txtH0 = new Text("Row"); 
GridPane.setHalignment(txtH0, HPos.CENTER); 
txtH0.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txtH0, 0, 0); 

Text txtH1 = new Text("Hospital ID"); 
GridPane.setHalignment(txtH1, HPos.CENTER); 
txtH1.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txtH1, 1, 0); 

Text txtH2 = new Text("First Name"); 
GridPane.setHalignment(txtH2, HPos.LEFT); 
txtH2.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txtH2, 2, 0); 

Text txtH3 = new Text("Last Name"); 
GridPane.setHalignment(txtH3, HPos.LEFT); 
txtH3.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txtH3, 3, 0); 

Text txtH4 = new Text("Room"); 
GridPane.setHalignment(txtH4, HPos.LEFT); 
txtH4.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14));` 
gpRpt.add(txtH4, 4, 0); 

for(int p = SR; p < ER; p++){ 

row = row + 1; 

Text txt0 = new Text(""+row); 
//row # 
GridPane.setHalignment(txt0, HPos.CENTER); 
txt0.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt0, 0, R); 

Text txt1 = new Text(togp.get(p)); 
//hospnum 
GridPane.setHalignment(txt1, HPos.CENTER); 
txt1.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt1, 1, R); 

Text txt2 = new Text(togp.get(p=p+1)); 
//fname 
GridPane.setHalignment(txt2, HPos.LEFT); 
txt2.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt2 , 2, R); 

Text txt3 = new Text(togp.get(p=p+1)); 
//lname 
GridPane.setHalignment(txt3, HPos.LEFT); 
txt3.setFont(Font.font("Times New Roman", FontWeight.BLACK, FontPosture.REGULAR, 14)); 
gpRpt.add(txt3, 3, R); 

Text txt4 = new Text(togp.get(p=p+1)); 
//roomnum 
GridPane.setHalignment(txt4, HPos.LEFT); 
txt4.setFont(Font.font("Times New Roman", FontWeight.BLACK, 
FontPosture.REGULAR, 14)); 
gpRpt.add(txt4, 4, R); 

Text txtS0 = new Text(" "); 
txtS0.prefHeight(5); 
Text txtS1 = new Text(" "); 
txtS1.prefHeight(5); 
Text txtS2 = new Text(" "); 
txtS2.prefHeight(5); 
Text txtS3 = new Text(" "); 
txtS3.prefHeight(5); 
GridPane.setFillHeight(txtS0, true); 
gpRpt.add(txtS0, 0, R+1); 
GridPane.setFillHeight(txtS1, true); 
gpRpt.add(txtS1, 1, R+1); 
GridPane.setFillHeight(txtS2, true); 
gpRpt.add(txtS2, 2, R+1); 
GridPane.setFillHeight(txtS3, true); 
gpRpt.add(txtS3, 3, R+1); 

R = R + 2; 
} 
onPrint(); 
} 

public void onPrint(){ 
//gpRpt.gridLinesVisibleProperty().set(true); 
gpRpt.setStyle("-fx-background-color:transparent"); 
print(gpRpt, selectedPrinter); 
} 
1

Вы можете попробовать что-то вроде этого:

// Get the print page size: 
final double prnW = pageLayout.getPrintableWidth(); 
final double prnH = pageLayout.getPrintableHeight(); 

// Work out how many pages across and down are needed (This code may not work?): 
final int pagesAcross = (int) Math.ceil(gridPane.getWidth()/prnW); 
final int pagesDown = (int) Math.ceil(gridPane.getHeight()/prnH); 

/* Print pages down and then across like so: 
    1 3 
    2 4 
    Swop the for loops around if you want to print pages across first and then down. 
*/ 
for (int pgCol = 0; pgCol < pagesAcross; pgCol++) 
{ 
    for (int pgRow = 0; pgRow < pagesDown; pgRow++) 
    { 
     gridPane.setTranslateX(-(prnW * pgCol)); 
     gridPane.setTranslateY(-(prnH * pgRow)); 
     job.printPage(pageLayout, gridPane); 
    } 
} 

job.endJob(); 
+0

как бы вы выпустить FORM FEED на принтер? –

+0

каждый 'job.printPage (pageLayout, gridPane);' печатает на отдельной странице. – Jurgen