2017-11-10 1 views
0

저는 사용자가 텍스트를 입력으로 입력 한 다음 코드 128 글꼴로 동일한 텍스트를 표시하여 바코드 입력을 확인하는 프로그램을 만들고 있습니다.JavaFX TextFlow에서 Code 128이 올바르게 표시되지 않는 이유는 무엇입니까?

이미 설치 코드 128 및 코드 (39)는/usr/share/글꼴/트루 아래/

두 글꼴이 제대로 설치해야 위치하고 있기 때문에 리브레 오피스 라이터에서 모두 작동합니다. 그러나 JavaFx 응용 프로그램에는 코드 39 만 올바르게 표시됩니다. 내가 잘 작동 모든게 좋을 꺼 "코드 39"와 "코드 128"를 교체 할 경우

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); 

} 
} 

: 내 코드의

.

코드 (39)와 출력 :

Code 39 output

그리고 여기에 코드 128로 출력됩니다 : 코드 128이 아닌 이유

Code 128 output

나도 몰라 올바르게 표시됩니다.

편집 : 좋아, 이제 코드 39 텍스트 앞뒤에 별표를 추가하려고했는데이 경우 모든 것이 작동합니다. 내 스마트 폰의 바코드 스캐너 앱으로 테스트 해보니 결과는 옳았습니다. 내가 GitHub의에서 발견 체크섬 메이커 내 코드를 강화 코드 128의 경우

: 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

+0

그리고 Libre Office에서 동일한 코드 128 글꼴을 사용하고 있습니까? –

+0

내가 생각할 수있는 유일한 것은 글꼴이 100 % 바코드 기호가 아니라는 것입니다. 어떤 이유로 Code 128 글꼴은 ASCII 코드를 사람이 읽을 수있는 문자로 매핑하고 막대 기호를 높은 ASCII로 묻었습니다.개인적으로 유니 코드 또는 높은 ASCII ($ 80- $ FF)가 작동해야하는 바코드 글꼴을 만드는 것은 좋지 않은 디자인 결정이라고 생각하지만 실제로 사람이 읽을 수있는 문자에 대한 기호가 있습니다. 모든 문자를 볼 수 있도록 매핑 소프트웨어에서 글꼴을 가져 왔습니까? –

답변

0

코드 39 글꼴을 사용하면 출력 결과가 좋지 않을 수도 있지만 그렇지 않습니다. 스캔하지 않고 코드 39 바코드로 인식 할 수 없습니다.

TEXT in Code 39

그리고이 코드 128과 같이 "TEXT"는 모습입니다 :

TEXT in Code 128

이의 모습으로,이 단어가 "TEXT는"코드 39의 모습입니다 Code 39 예제에 표시되는 내용은 실제로 막대의 하위 집합이므로 다음과 같이 시작 및 중지 문자가 누락되었습니다.

The code 39 bars from the screeshot, highlighted.

코드 128을 사용하면 시작, 중지 및 체크섬 문자가 제공되지 않을 수 있으며 렌더링이 실패한 것 같습니다.

+0

또한 낮은 ASCII ($ 00- $ 7F) 문자를 Code 128에 전달하는지 확인하십시오. 글꼴이 UTF-8 또는 UTF-16에서 작동하지 않을 수 있습니다. 글꼴의 설명서를 확인하십시오. –

관련 문제