有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么代码128不能在JavaFXTextFlow中正确显示?

我目前正在创建一个程序,用户在其中输入一个文本,然后以128码字体显示相同的文本,以将其输入视为条形码

我已经在/usr/share/fonts/truetype下安装并找到了代码128和代码39/

这两种字体都应该正确安装,因为它们都可以在Libre Office Writer中使用。但是,在我的JavaFx应用程序中,只有代码39正确显示

这是我的密码:

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class CreateBarcodeStage extends Stage {

VBox vbox;

TextField textFieldInput;
TextFlow textFlowOutput;

public CreateBarcodeStage() {
    createUI();
    this.setTitle("Create Barcode");
    this.setScene(new Scene(vbox));
}

private void createUI() {
    vbox = new VBox(10);

    textFieldInput = new TextField();
    textFieldInput.textProperty().addListener((ObservableValue<? extends String> observableValue, String s, String t1) -> {
        String inputText = textFieldInput.getText();

        textFlowOutput.getChildren().clear();

        Text textReadable = new Text();
        textReadable.setFont(Font.font("Verdana", 20));
        textReadable.setText(inputText + "\n\n");

        Text textBarcode = new Text();
        textBarcode.setFont(Font.font("Code 128", 40));
        textBarcode.setText(inputText);

        textFlowOutput.getChildren().addAll(textReadable, textBarcode);
    });
    textFlowOutput = new TextFlow();
    textFlowOutput.setPadding(new Insets(15));
    textFlowOutput.setPrefWidth(200);
    textFlowOutput.setPrefHeight(150);


    vbox.getChildren().addAll(textFieldInput, textFlowOutput);

}
}

如果我将“代码128”替换为“代码39”,一切正常

这是代码为39的输出:

Code 39 output

下面是代码为128的输出:

Code 128 output

我不知道为什么代码128没有正确显示

编辑: 好的,现在我尝试在代码39文本前后添加一个asterix,在本例中,一切正常。我用智能手机上的条形码扫描仪应用程序对它进行了测试,结果是正确的

对于代码128,我使用在github上找到的校验和生成器增强了代码: github Code 128 barcode generator

现在,我的代码如下所示:

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class CreateBarcodeStage extends Stage {
VBox vbox;

TextField textFieldInput;
TextFlow textFlowOutput;

public CreateBarcodeStage() {
    createUI();
    this.setTitle("Create Barcode");
    this.setScene(new Scene(vbox));
}

private void createUI() {
    vbox = new VBox(10);

    textFieldInput = new TextField();
    textFieldInput.textProperty().addListener((ObservableValue<? extends String> observableValue, String s, String t1) -> {
        String inputText = textFieldInput.getText();

        textFlowOutput.getChildren().clear();

        Text textReadable = new Text();
        textReadable.setFont(Font.font("Verdana", 20));
        textReadable.setText(inputText + "\n\n");

        Text textBarcode = new Text();
        textBarcode.setFont(Font.font("Code 128", 40));
        textBarcode.setText(inputText);

        textFlowOutput.getChildren().addAll(textReadable, textBarcode);
    });
    textFlowOutput = new TextFlow();
    textFlowOutput.setPadding(new Insets(15));
    textFlowOutput.setPrefWidth(200);
    textFlowOutput.setPrefHeight(150);


    vbox.getChildren().addAll(textFieldInput, textFlowOutput);

}

private String createCode128(String text) {
    return (char) 136 + text + checksum(text) + (char) 138;
}

char checksum(String text) {
    int result = 104; // Code 128B start code
    for (int i = 0; i < text.length(); i++) {
        result += ((int) text.charAt(i) - 32) * (i + 1);
    }
    return (char) (result % 103 + 32); // Return the character value of the checksum.
    }
}

但是,它仍然不起作用: Code 128 with start/stop symbol and checksum


共 (1) 个答案

  1. # 1 楼答案

    虽然使用代码39字体的输出可能看起来很好,但事实并非如此。它不会扫描,也无法识别为代码39条形码。代码39中的“文本”一词是这样的:

    TEXT in Code 39

    代码128的“文本”是这样的:

    TEXT in Code 128

    对于代码39,似乎缺少开始和停止字符,因为代码39示例中显示的实际上是条的子集,如下所示:

    The code 39 bars from the screeshot, highlighted.

    我怀疑对于代码128,您可能没有提供开始、停止和校验和字符,因此渲染失败