如何使用JavaFX和热敏打印机打印漂亮的收据/账单?
我知道我们已经有这个问题了,但他们根本帮不了我。我如何创建和打印一张漂亮的收据/账单,以及图片上的收据/账单: 这是我的打印空白:如何使用JavaFX和热敏打印机打印漂亮的收据/账单?,javafx,printing,Javafx,Printing,我知道我们已经有这个问题了,但他们根本帮不了我。我如何创建和打印一张漂亮的收据/账单,以及图片上的收据/账单: 这是我的打印空白: public void ReceiptPrinter(Node node){ Printer printer = Printer.getDefaultPrinter(); PageLayout page = printer.getDefaultPageLayout(); double X = page.getPrintableWidt
public void ReceiptPrinter(Node node){
Printer printer = Printer.getDefaultPrinter();
PageLayout page = printer.getDefaultPageLayout();
double X = page.getPrintableWidth() / (node.getBoundsInParent().getWidth());
double Y = page.getPrintableHeight() / (node.getBoundsInParent().getHeight());
System.out.println("X = "+X);
System.out.println("Y = "+Y);
Scale SCL = new Scale(X, Y);
node.getTransforms().add(SCL);
PrinterJob PJ = PrinterJob.createPrinterJob(printer);
if(PJ != null){
boolean Success = PJ.printPage(page, node);
if(Success){
PJ.endJob();
}
}
node.getTransforms().remove(SCL);
}
调用并执行如下操作:
new ReceiptPrinter().ReceiptPrinter(My_TableView);
以下是我的完整代码源代码:
public class VendaMode1 {
private VBox PnlProduto, PnlFactura;
private GridPane PnlQnt;
private Label LblTitle, LblTitle2, LblDesc, LblPrice;
static TextField TxtSource;
private Label LblTitle3;
private TextField TxtQnt;
private Button CmdOk, CmdCancel, CmdClear;
private StackPane PnlTable;
private TableView TblProds;
private TableColumn ColDesc, ColPrec, ColQnt, ColSubTtl;
private GridPane PnlPagar;
private Label LblTitlo4, LblTotal;
private Button CmdBorrar, CmdPagar;
private Timeline TL;
private String USER;
public HBox PnlVMode1(HBox PnlVenda, String Func){
PnlVenda = new HBox();
PnlVenda.setPadding(new Insets(10,10,10,10));
PnlVenda.setSpacing(10);
PnlVenda.setAlignment(Pos.TOP_CENTER);
PnlVenda.setStyle("-fx-background-color: White;");
USER = Func;
if(PnlVenda.isFocused()){
TxtSource.requestFocus();
}
ProdReview();
PnlVenda.getChildren().add(PnlProduto);
ProdFactura();
PnlVenda.getChildren().add(PnlFactura);
return PnlVenda;
}
public void focusCycle(boolean RUN){
if(RUN==true)TxtSource.requestFocus();
}
public void ProdReview(){
PnlProduto = new VBox();
PnlProduto.setPadding(new Insets(10,10,10,10));
PnlProduto.setSpacing(10);
PnlProduto.setPrefWidth(500);
PnlProduto.setStyle("-fx-background-color: Black;");
if(PnlProduto.isFocused()){
TxtSource.requestFocus();
}
VBox PnlFind = new VBox();
PnlFind.setAlignment(Pos.CENTER);
LblTitle = new Label("Codigo");
LblTitle.setPrefSize(500, 20);
LblTitle.setAlignment(Pos.CENTER);
LblTitle.setStyle("-fx-background-color: Grey;");
TxtSource = new TextField("");
TxtSource.setPrefSize(500, 80);
TxtSource.setAlignment(Pos.CENTER);
LblTitle2 = new Label("Descricao e Preco");
LblTitle2.setPrefSize(500, 20);
LblTitle2.setAlignment(Pos.CENTER);
LblTitle2.setStyle("-fx-background-color: Grey;");
LblDesc = new Label("");
LblDesc.setPrefSize(500, 40);
LblDesc.setAlignment(Pos.CENTER);
LblDesc.setStyle("-fx-background-color: White;");
LblDesc.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
LblPrice = new Label("");
LblPrice.setPrefSize(500, 40);
LblPrice.setAlignment(Pos.CENTER);
LblPrice.setStyle("-fx-background-color: White;");
LblPrice.setFont(Font.font("Times New Roman", FontWeight.BOLD, 50));
PnlFind.getChildren().addAll(LblTitle, TxtSource);
VBox.setMargin(LblTitle2, new Insets(10, 0,0,0));
PnlFind.getChildren().addAll(LblTitle2, LblDesc, LblPrice);
ProdQnt();
VBox.setMargin(PnlQnt, new Insets(10, 0,0,0));
PnlFind.getChildren().add(PnlQnt);
TxtSource.setOnKeyPressed(new EventHandler<KeyEvent>(){
public void handle(KeyEvent kv){
if(kv.getCode() == KeyCode.ENTER){
getProd();
if(LblPrice.getText()==""){
TxtQnt.setText("");
TxtSource.setText("");
TxtSource.requestFocus();
}else{
TxtQnt.setText("1");
TxtQnt.requestFocus();
}
}
}
});
PnlProduto.getChildren().add(PnlFind);
}
public void getProd(){
Connection Con = null;
try{
Con = DBConnection.GetConnection();
}catch(SQLException ex){
new MsgBox().MessageBox("Connection Error", ex.getMessage());
}
String Query = "Select PrdDescricao, PrdPreco from Produtos Where PrdCodigo = ?";
try{
PreparedStatement Sttm = Con.prepareStatement(Query);
Sttm.setString(1, TxtSource.getText());
ResultSet Rs = Sttm.executeQuery();
while(Rs.next()){
LblDesc.setText(Rs.getString("PrdDescricao"));
LblPrice.setText(Rs.getString("PrdPreco"));
}
Sttm.close();
Con.close();
}catch(Exception ex){
new MsgBox().MessageBox("Connection Error", ex.getMessage());
}
}
public void ProdQnt(){
PnlQnt = new GridPane();
PnlQnt.setGridLinesVisible(true);
PnlQnt.setVgap(10);
PnlQnt.setHgap(10);
ColumnConstraints COL1 = new ColumnConstraints(60,60,60);
COL1.setHgrow(Priority.NEVER);
ColumnConstraints COL2 = new ColumnConstraints();
RowConstraints ROW1 = new RowConstraints(10,10,10);
ROW1.setVgrow(Priority.NEVER);
PnlQnt.getColumnConstraints().add(0, COL1);
PnlQnt.getColumnConstraints().add(1, COL1);
PnlQnt.getColumnConstraints().add(2, COL1);
PnlQnt.getColumnConstraints().add(3, COL2);
LblTitle3 = new Label("Quantidade");
LblTitle3.setPrefSize(500, 20);
LblTitle3.setAlignment(Pos.CENTER);
LblTitle3.setStyle("-fx-background-color: Grey;");
TxtQnt = new TextField();
TxtQnt.setFont(Font.font("Times New Roman", FontWeight.BOLD, 50));
TxtQnt.setPrefSize(500, 115);
TxtQnt.setAlignment(Pos.CENTER);
CmdOk = new Button("OK");
CmdOk.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
CmdOk.setPrefSize(500, 115);
CmdOk.setAlignment(Pos.CENTER);
CmdCancel = new Button("Cancel");
CmdCancel.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
CmdCancel.setPrefSize(500, 115);
CmdCancel.setPrefSize(500, 50);
CmdClear = new Button("Clear");
CmdClear.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
CmdClear.setPrefSize(300, 50);
Button Char[] = new Button[]{
new Button("0"),
new Button("1"),
new Button("2"),
new Button("3"),
new Button("4"),
new Button("5"),
new Button("6"),
new Button("7"),
new Button("8"),
new Button("9"),
};
for(int i=0; i<10; i++){
Char[i].setPrefSize(50, 30);
Char[i].setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
}
CmdClear.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
TxtQnt.setText("1");
TxtQnt.requestFocus();
}
});
Char[0].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+0);
}
});
Char[1].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+1);
}
});
Char[2].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+2);
}
});
Char[3].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+3);
}
});
Char[4].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+4);
}
});
Char[5].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+5);
}
});
Char[6].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+6);
}
});
Char[7].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+7);
}
});
Char[8].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+8);
}
});
Char[9].setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
String Qnt = TxtQnt.getText();
TxtQnt.setText(Qnt+9);
}
});
TxtQnt.setOnKeyPressed(new EventHandler<KeyEvent>(){
public void handle(KeyEvent kv){
if(kv.getCode()== KeyCode.ENTER){
if(LblPrice.getText()==""){
TxtSource.requestFocus();
return;
}
try{
Integer.parseInt(TxtQnt.getText());
}catch(Exception ex){
TxtQnt.requestFocus();
return;
}
getTableVal();
TxtSource.setText("");
LblDesc.setText("");
LblPrice.setText("");
TxtQnt.setText("");
TxtSource.requestFocus();
}
}
});
CmdOk.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(LblPrice.getText()==""){
TxtQnt.setText("");
TxtSource.requestFocus();
return;
}
try{
Integer.parseInt(TxtQnt.getText());
}catch(Exception ex){
TxtQnt.setText("1");
TxtQnt.requestFocus();
return;
}
getTableVal();
TxtSource.setText("");
LblDesc.setText("");
LblPrice.setText("");
TxtQnt.setText("");
TxtSource.requestFocus();
}
});
CmdCancel.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
TxtSource.setText("");
LblDesc.setText("");
LblPrice.setText("");
TxtQnt.setText("");
TxtSource.requestFocus();
}
});
PnlQnt.add(LblTitle3, 0, 0, 6, 1);
PnlQnt.add(TxtQnt, 3, 1, 3, 2);
PnlQnt.add(CmdOk, 3, 3, 3, 2);
PnlQnt.add(CmdCancel, 3, 5, 3, 1);
PnlQnt.add(CmdClear, 0, 5, 3, 1);
PnlQnt.add(Char[1], 0, 1);
PnlQnt.add(Char[2], 1, 1);
PnlQnt.add(Char[3], 2, 1);
PnlQnt.add(Char[4], 0, 2);
PnlQnt.add(Char[5], 1, 2);
PnlQnt.add(Char[6], 2, 2);
PnlQnt.add(Char[7], 0, 3);
PnlQnt.add(Char[8], 1, 3);
PnlQnt.add(Char[9], 2, 3);
PnlQnt.add(Char[0], 1, 4);
}
private double Total;
public void getTableVal(){
String Desc = null;
double Price = 0;
int Qnt = 0;
double Subtotal = 0;
try{
Desc = LblDesc.getText();
Price = Double.parseDouble(LblPrice.getText());
Qnt = Integer.parseInt(TxtQnt.getText());
Subtotal = Price * Qnt;
Total = Total + Subtotal;
}catch(Exception ex){
new MsgBox().MessageBox("Erro de Formato", ex.getMessage());
}
ObservableList<SellingProdDataFactory> DT = FXCollections.observableArrayList();
DT.addAll(new SellingProdDataFactory(Desc, Price, Qnt, Subtotal));
TblProds.getItems().addAll(DT);
LblTotal.setText(String.valueOf(Total));
}
public void ProdFactura(){
PnlFactura = new VBox();
PnlFactura.setPadding(new Insets(10,10,10,10));
PnlFactura.setSpacing(10);
PnlFactura.setPrefWidth(500);
PnlFactura.setStyle("-fx-background-color: Black;");
if(PnlFactura.isFocused()){
TxtSource.requestFocus();
}
ProdTable();
PnlFactura.getChildren().addAll(PnlTable, PnlPagar);
TxtSource.requestFocus();
}
public void ProdTable(){
PnlTable = new StackPane();
PnlTable.setMaxHeight(365);
TblProds = new TableView<>();
ColDesc = new TableColumn<>("Descricao");
ColDesc.setMinWidth(200);
ColDesc.setCellValueFactory(new PropertyValueFactory("Descricao"));
ColPrec = new TableColumn<>("Preco");
ColPrec.setMinWidth(50);
ColPrec.setCellValueFactory(new PropertyValueFactory("Price"));
ColQnt = new TableColumn<>("Qnt");
ColQnt.setMinWidth(30);
ColQnt.setCellValueFactory(new PropertyValueFactory("Qnt"));
ColSubTtl = new TableColumn<>("Subtotal");
ColSubTtl.setMinWidth(50);
ColSubTtl.setCellValueFactory(new PropertyValueFactory("Subtotal"));
TblProds.getColumns().addAll(ColDesc, ColPrec, ColQnt, ColSubTtl);
PnlTable.getChildren().add(TblProds);
PnlPagar = new GridPane();
PnlPagar.setHgap(5);
PnlPagar.setVgap(10);
LblTitlo4 = new Label("Total");
LblTitlo4.setPrefSize(500, 20);
LblTitlo4.setAlignment(Pos.CENTER);
LblTitlo4.setStyle("-fx-background-color: Grey;");
LblTotal = new Label("000.00");
LblTotal.setPrefSize(500, 80);
LblTotal.setFont(Font.font("Times New Roman", FontWeight.BOLD, 100));
LblTotal.setAlignment(Pos.CENTER);
LblTotal.setStyle("-fx-background-color: White; -fx-text-fill: Red;");
CmdBorrar = new Button("Borrar");
//CmdOk.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
CmdBorrar.setPrefSize(200, 50);
CmdBorrar.setAlignment(Pos.CENTER);
CmdPagar = new Button("Pagar");
//CmdPagar.setFont(Font.font("Times New Roman", FontWeight.BOLD, 30));
CmdPagar.setPrefSize(300, 50);
CmdPagar.setAlignment(Pos.CENTER);
PnlPagar.add(LblTitlo4, 0, 0, 3, 1);
PnlPagar.add(LblTotal, 0, 1, 3, 1);
PnlPagar.add(CmdBorrar, 0, 2);
PnlPagar.add(CmdPagar, 1, 2, 2, 1);
CmdPagar.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
if(Total<=0){
TxtSource.requestFocus();
return;
}
boolean Chk = new Pagar().Pagar(new Stage(), Total);
if(Chk == true){
ReportarVenda.ReportVenda(USER, 2, Total);
new ReceiptPrinter().ReceiptPrinter(TblProds);
Total = 0.0;
TblProds.getItems().clear();
LblTotal.setText("");
LblDesc.setText("");
LblPrice.setText("");
TxtSource.setText("");
}
TxtSource.requestFocus();
}
});
CmdBorrar.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ev){
TblProds.getItems().clear();
Total = 0.0;
LblTotal.setText("0.0");
LblDesc.setText("");
LblPrice.setText("");
TxtSource.setText("");
TxtSource.requestFocus();
}
});
}
}
public-class-VendaMode1{
私人VBox PnlProduto,PnlFactura;
专用网格窗格PnlQnt;
自有品牌LblTitle、LblTitle2、LblDesc、LblPrice;
静态文本字段TxtSource;
自有品牌LblTitle3;
私有文本字段TxtQnt;
专用按钮CmdOk、CmdCancel、CmdClear;
私有堆栈窗格PnlTable;
私人桌面视图;
私人表格C、COLPEC、ColQnt、COLSUTTL;
私有网格窗格PnlPagar;
自有品牌LblTitlo4,LblTotal;
专用按钮CmdBorrar、CmdPagar;
私有时间线TL;
私有字符串用户;
公共HBox PnlVMode1(HBox PnlVenda,字符串函数){
PnlVenda=新的HBox();
PnlVenda.设置填充(新插图(10,10,10,10));
PnlVenda.setspace(10);
PnlVenda.设置对齐(位置顶部\中心);
PnlVenda.setStyle(“-fx背景色:白色;”);
用户=Func;
if(PnlVenda.isFocused()){
TxtSource.requestFocus();
}
ProdReview();
PnlVenda.getChildren().add(PnlProduto);
前因子();
PnlVenda.getChildren().add(PnlFactura);
返回PnlVenda;
}
公共无效焦点循环(布尔运行){
if(RUN==true)TxtSource.requestFocus();
}
公众谘询({
PnlProduto=新的VBox();
PnlProduto.设置填充(新插图(10,10,10,10));
PnlProduto.setspace(10);
PnlProduto.setPrefWidth(500);
PnlProduto.setStyle(“-fx背景色:黑色;”);
if(PnlProduto.isFocused()){
TxtSource.requestFocus();
}
VBox PnlFind=新的VBox();
PnlFind.设置对齐(位置中心);
LblTitle=新标签(“Codigo”);
lbltite.setPrefSize(500,20);
Lblitle.设置对齐(位置中心);
LblTitle.setStyle(“-fx背景色:灰色;”);
TxtSource=新文本字段(“”);
TxtSource.setPrefSize(500,80);
TxtSource.setAlignment(位置中心);
LblTitle2=新标签(“说明预处理”);
LblTitle2.setPrefSize(500,20);
LblTitle2.设置对齐(位置中心);
LblTitle2.setStyle(“-fx背景色:灰色;”);
LblDesc=新标签(“”);
LblDesc.setPrefSize(500,40);
LblDesc.设置校准(位置中心);
LblDesc.setStyle(“-fx背景色:白色;”);
LblDesc.setFont(Font.Font(“Times New Roman”,fontwweight.BOLD,30));
LblPrice=新标签(“”);
LblPrice.setPrefSize(500,40);
LblPrice.setAlignment(位置中心);
LblPrice.setStyle(“-fx背景色:白色;”);
LblPrice.setFont(Font.Font(“Times New Roman”,fontwweight.BOLD,50));
PnlFind.getChildren().addAll(LblTitle,TxtSource);
VBox.setMargin(LblTitle2,新插图(10,0,0,0));
PnlFind.getChildren().addAll(LblTitle2、LblDesc、LblPrice);
ProdQnt();
VBox.setMargin(PnlQnt,新插图(10,0,0,0));
PnlFind.getChildren().add(PnlQnt);
setOnKeyPressed(新的EventHandler(){
公共无效句柄(KeyEvent kv){
if(kv.getCode()==KeyCode.ENTER){
getProd();
if(LblPrice.getText()=“”){
TxtQnt.setText(“”);
TxtSource.setText(“”);
TxtSource.requestFocus();
}否则{
TxtQnt.setText(“1”);
TxtQnt.requestFocus();
}
}
}
});
PnlProduto.getChildren().add(PnlFind);
}
public void getProd(){
连接Con=null;
试一试{
Con=DBConnection.GetConnection();
}catch(SQLException-ex){
新建MsgBox().MessageBox(“连接错误”,例如getMessage());
}
String Query=“从Produtos中选择PrdDescricao、PrdPreco,其中PrdCodigo=?”;
试一试{
PreparedStatement Sttm=Con.prepareStatement(查询);
setString(1,TxtSource.getText());
ResultSet Rs=Sttm.executeQuery();
while(Rs.next()){
LblDesc.setText(Rs.getString(“PrdDescricao”);
LblPrice.setText(Rs.getString(“PrdPreco”);
}
Sttm.close();
Con.close();
}捕获(例外情况除外){
新建MsgBox().MessageBox(“连接错误”,例如getMessage());
}
}
公共产品编号(){
PnlQnt=新网格窗格();
PnlQnt.setGridLinesVisible(真);
PnlQnt.setVgap(10);
PnlQnt.setHgap(10);
ColumnConstraints COL1=新的ColumnConstraints(60,60,60);
COL1.setHgrow(Priority.NEVER);
ColumnConstraints COL2=新ColumnConstraints();
RowConstraints ROW1=新的RowConstraints(10,10,10);
行1.setVgrow(优先级.从不);
PnlQnt.getColumnConstraints().add(0,COL1);
PnlQnt.getColumnConstraints().add(1,COL1);
PnlQnt.getColumnConstraints().add(2,COL1);
PnlQnt.getColumnConstraints().add(3,COL2);
LblTitle3=新标签(“Quantidade”);
LblTitle3.setPrefSize(500,20);
LblTitle3.设置对齐(位置中心);
LblTitle3.setStyle(“-fx背景色:灰色;”);
TxtQnt=新文本字段();
setFont(Font.Font(“Times New Roman”,fontwweight.BOLD,50));
TxtQnt.setPrefSize(500115);
TxtQnt.设置对齐(位置中心);
CmdOk=新按钮(“确定”);
setFont(Font.Font(“Times New Roman”,fontwweight.BOLD,30));
setPrefSize(500115);
CmdOk.setAlignment(位置中心);
CmdCancel=新建按钮(“取消”);
CmdCancel.setFont(Font.Font(“Times New Roman”,fontwweight.BOLD,30));
CmdCancel.setPrefSize(500115);
CmdCancel.setPrefSize(500,50);
CmdClear=新按钮(“清除”);
CmdClear.setFont(Font.Font(“Times New Roman”),Fon