- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Android 中有一个项目,其中我制作了一个类似于购物 list 应用程序的东西,可以打印到收据热敏打印机。我设计收据的方式很简单:我创建了一个 .xml 布局,其中为标题添加了 1 个线性布局,为列添加了 3 个垂直线性布局,为页脚添加了另一个布局。之后,我只需以编程方式将文本添加到布局中,然后然后将 .xml 发送到打印。太棒了,我可以轻松设置字体,轻松移动内容,添加图像、 Logo 等任何内容。
现在,我知道我可以使用graphics2d并打印GUI组件,我用文本区域测试了它,它工作得很好。当你有大约100行时它甚至会滚动,不像jframes,它只打印它所看到的内容。
我的问题是我需要 3-4 列文本。如下所示:
1. Bananas 4 11.20$
2. Toilet paper 12 3.99$
3. Donuts 1 0.49$
我可以将其添加到文本区域并打印它,但问题是文本的长度会有所不同,并且文本会变得困惑且不均匀。
那么,我怎样才能像在android中那样做:添加3-4列,我可以在其中添加文本,即使它们有100行,打印机也将成功打印所有行,而不是您无需向下滚动即可看到的行?
提前致谢,祝你有美好的一天!
最佳答案
经过近 6 年的时间,我终于有时间再次打开该项目,并考虑发布我最终使用的解决方案,所以这里是:
@Log4j2
@Service
public class PrintService implements Printable {
@Autowired
private PreviewManager previewManager;
public boolean printCopies() {
final JPanel printPanel = new JPanel();
DefaultListModel listModel = new DefaultListModel();
printPanel.setLayout(new BoxLayout(printPanel, BoxLayout.PAGE_AXIS));
printPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JLabel label = new JLabel("Select the number of copies");
listModel.addElement("0");
listModel.addElement("1");
listModel.addElement("2");
listModel.addElement("3");
listModel.addElement("4");
listModel.addElement("5");
final JList list = new JList(listModel);
list.setVisibleRowCount(1);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
final int[] nrOfCopies = {1};
list.addListSelectionListener(lse -> nrOfCopies[0] = Integer.parseInt((String) list.getSelectedValue()));
printPanel.add(label);
printPanel.add(list);
label.setAlignmentX(JComponent.CENTER_ALIGNMENT);
list.setAlignmentX(JComponent.CENTER_ALIGNMENT);
list.setSelectedIndex(1);
JOptionPane jop = new JOptionPane(printPanel,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION);
JDialog dialog = jop.createDialog(EMPTY_STRING);
dialog.setAlwaysOnTop(true);
dialog.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
SwingUtilities.invokeLater(list::requestFocusInWindow);
}
});
dialog.setVisible(true);
int result = (Integer) jop.getValue();
dialog.dispose();
if (result == JOptionPane.OK_OPTION) {
log.info("Printing {} copies of the list", nrOfCopies[0]);
for (int c = 0; c < nrOfCopies[0]; c++) {
print();
}
return true;
}
// todo: bring back
return false;
}
public void print() {
PrinterJob pjob = PrinterJob.getPrinterJob();
javax.print.PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
for (javax.print.PrintService printer : printServices) {
// in my case I use a Star TSP143 thermal printer
if (printer.getName().contains("tsp143")) {
try {
pjob.setPrintService(printer);
} catch (PrinterException e) {
log.error(e);
}
}
}
PageFormat preformat = pjob.defaultPage();
preformat.setOrientation(PageFormat.PORTRAIT);
PageFormat postformat = pjob.defaultPage(preformat);
Paper p = preformat.getPaper();
p.setImageableArea(0, 0, postformat.getWidth(), postformat.getHeight());
postformat.setPaper(p);
//If user does not hit cancel then print.
if (preformat != postformat) {
//Set print component
pjob.setPrintable(PrintService.this, postformat);
try {
pjob.print();
} catch (PrinterException ex) {
log.error(ex);
}
}
}
@Override
public int print(Graphics g, PageFormat format, int page_index) {
// depends on your use case, printableJpanel is going to be the panel you are going to print
JPanel printableJpanel = previewManager.getPrintablePanel();
if (page_index > 0) {
return Printable.NO_SUCH_PAGE;
}
// get the bounds of the component
Dimension dim = printableJpanel.getSize();
double cHeight = dim.getHeight();
double cWidth = dim.getWidth();
// get the bounds of the printable area
double pHeight = format.getImageableHeight();
double pWidth = format.getImageableWidth();
double pXStart = format.getImageableX();
double pYStart = format.getImageableY();
double xRatio = pWidth / cWidth;
double yRatio = pHeight / cHeight;
Graphics2D g2 = (Graphics2D) g;
g2.translate(pXStart, pYStart);
g2.scale(xRatio, 0.80);
printableJpanel.paint(g2);
return Printable.PAGE_EXISTS;
}
}
祝你好运!
关于java - 用java设计热敏打印机收据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435840/
我一直在尝试学习Grails,但是我遇到了以下问题。我已经创建了四个域类(Receipts,Items,类别和所有者),并且为每个域类(ReceiptsController,ItemsControll
我正在构建一个销售点应用程序,我想打印一张收据。问题是我使用的打印机无法打印纯文本的任何图形,我在 javafx 中只能找到使用 Print API 打印节点或使用像 jasper 这样都包含图形的报
我正在 Swift 3.0 应用程序中实现应用程序内购买,因此我需要获取应用程序收据以根据 iTunes 商店对其进行验证。这是我获得收据的方式: func getReceipt() -> Data?
我想在我的数据库中保存非消耗品的 IAP 收据。我们有一个用于 IAP 恢复的两步下载机制。 使用 StoreKit 机制检索所有交易(包括收据)。 从所有收据(即这些收据背后的产品)列表中选择稍后要
我想验证 iOS 收据。 我想我会向 App Store 验证服务器发送收据(https://sandbox.itunes.apple.com/verifyReceipt 或 https://buy.
我需要打印具有相同产品数量等的销售订单的 POS 收据 在销售订单中,我创建了一个按钮“打印 POS 收据”。使用此按钮,我想触发一种方法,该方法打印出带有销售订单行的收据。 所以我需要找到创建 PO
我们现在有一个正在生产中的应用程序,它会将 IAP 收据发送到我们的服务器,这些收据显然太短,而且我们的服务器没有经过 apple 的验证。 Apple 正确验证的长收据长度为 3192。短收据长度均
我正在构建一个 iOS 应用程序,它提供我们网站已经提供的服务。这是一项基于订阅的服务,订阅后所有功能都会启用。为了让人们在应用程序上注册定期付款,我似乎必须通过 Apple 的应用程序内购买 API
我需要一种方法来捕获笔记本中打印的所有内容。 为什么? 我有一个 PHP 系统,有时我需要打印(php_printer) 一些发票,但这会花费很多纸张。 打印在后台发送,没有任何弹出窗口供用户确认。
我对此有点困惑。所以关注this approach我得到了包含一堆解密字段的 json。其中 original_purchase_date。 我需要的是跟踪在这个新版本免费之前是否购买了应用程序,我认
首先,我说的不是调用https://buy.itunes.apple.com/verifyReceipt/ ,相反,我要问的是如何验证来 self 们的一位用户的 iTuneStore 收据。 我们的
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
所以我要建立一个在线商店,我想向客户发送包含收据的订单确认。我搜索了一下,但我还没有设法创建任何东西。 这是我发现并尝试使用的东西,但没有成功创建任何东西。 所以 ajax 调用会将 cartCon
所以我要建立一个在线商店,我想向客户发送包含收据的订单确认。我搜索了一下,但我还没有设法创建任何东西。 这是我发现并尝试使用的东西,但没有成功创建任何东西。 所以 ajax 调用会将 cartCon
我正在尝试实现自动续订订阅。我的应用程序可以在不同的设备(Android、Web)上使用,因此我需要实现状态轮询技术,以便在 App Store 设法续订过期订阅时确认我的服务器。收据正在我的服务器上
我正在尝试验证来自 C++ 服务器的 iphone 收据(我有使用 base64 加密的收据,我正在根据苹果文档编写一个 json 对象,然后我打开一个到沙箱的套接字并发送一个 POST请求)。 服务
首先,这个问题与 iOS7+ 收据有关,因此所有关于 latest_receipt 和 latest_receipt_info 的问题/答案都不适用(因为它们已被弃用并且正在离开)。似乎关于在 SO
谁能告诉我如何使用 Exchange Web 服务 API 获取电子邮件正文、收据、发件人、抄送信息?我只知道如何获取主题。 ExchangeService service = new Exchang
有关服务器到服务器通知的 Apple 文档没有指定 cancellation_date 字段中的数据格式。我正在尝试为我的通知处理程序设置一些单元测试,但我不确定要将哪些数据放入我的模拟响应中。 我假
我正在尝试使用 Citizen CT-S651 热敏打印机从网络浏览器打印 HTML/CSS 媒体格式的收据。我们已经能够正确格式化收据,但问题是在打印收据后,打印机继续吐纸而不是在内容的末尾切割。
我是一名优秀的程序员,十分优秀!