Java 动态生成收据
我想创建一个票据收据,在该收据中,从将生成的票据数据库中提取项目。我已经使用了上面的代码,但我面临的问题是它的格式。我怎样才能把它放在正确的票据收据格式中Java 动态生成收据,java,swing,awt,Java,Swing,Awt,我想创建一个票据收据,在该收据中,从将生成的票据数据库中提取项目。我已经使用了上面的代码,但我面临的问题是它的格式。我怎样才能把它放在正确的票据收据格式中 final JFrame frame = new JFrame("Bill"); frame.getContentPane().setBackground(Color.WHITE); JLabel jlabel = new JLabel(""); jlabel.setFont(new Font("S
final JFrame frame = new JFrame("Bill");
frame.getContentPane().setBackground(Color.WHITE);
JLabel jlabel = new JLabel("");
jlabel.setFont(new Font("Serif", Font.PLAIN, 12));
frame.add(jlabel);
frame.validate();
frame.repaint();
jlabel = new JLabel("-----------BILL-----------");
jlabel.setFont(new Font("Serif", Font.PLAIN, 20));
frame.add(jlabel);
frame.validate();
frame.repaint();
jlabel = new JLabel("");
jlabel.setFont(new Font("Serif", Font.PLAIN, 12));
frame.add(jlabel);
frame.validate();
frame.repaint();
frame.setLayout(new GridLayout(0, 3));
try {
String sql = "SELECT * FROM order_detail";
rs = st.executeQuery(sql);
frame.add(new JLabel("Item"));
frame.validate();
frame.repaint();
frame.add(new JLabel("Quantity"));
frame.validate();
frame.repaint();
frame.add(new JLabel("Amount"));
frame.validate();
frame.repaint();
while (rs.next()) {
String printLbl = rs.getString("Item");
frame.add(new JLabel(printLbl));
frame.validate();
frame.repaint();
printLbl =""+rs.getInt("Quantity");
frame.add(new JLabel(printLbl));
frame.validate();
frame.repaint();
printLbl = ""+rs.getInt("Cost");
frame.add(new JLabel(printLbl));
frame.validate();
frame.repaint();
}
frame.add(new JLabel(""));
frame.validate();
frame.repaint();
frame.add(new JLabel("Total"));
frame.validate();
frame.repaint();
frame.add(new JLabel(jLabel82.getText()));
frame.validate();
frame.repaint();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700, 400);
frame.setVisible(true);
PrinterJob job = PrinterJob.getPrinterJob();
job.setJobName("frame");
job.setPrintable(new Printable() {
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (pageNum > 0) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2 = (Graphics2D) pg;
g2.translate(pf.getImageableX(), pf.getImageableY());
frame.paint(g2);
return Printable.PAGE_EXISTS;
}
});
boolean ok = job.printDialog();
if (ok) {
try {
job.print();
} catch (PrinterException ex) {
}
请尝试这段代码,它可能会对您有所帮助。尽管您的代码可以进行大量清理,但通常使用JComponents会有点麻烦,尤其是当它仅用于打印时。创建HTML文本,并将其放入标签中。那么你就有了更多的方式来设计事物。 首先,良好的格式是可能的。使用MessageFormat可以使用不同的区域设置,但至少有一个接收到正确的千个分隔符等等
package com.inse6260.atms.view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Receipt
{
public Receipt(String receiptText, JFrame parent)
{
final JDialog dialog = new JDialog(parent,"TRANSACTION RECEIPT");
JTextArea textArea = new JTextArea(100, 20);
textArea.setEnabled(false);
textArea.setDisabledTextColor(Color.BLACK);
textArea.setText(receiptText);
JButton closeButton = new JButton("Close");
closeButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dialog.setVisible(false);
dialog.dispose();
}
});
JPanel closePanel = new JPanel();
closePanel.setLayout(new BoxLayout(closePanel, BoxLayout.LINE_AXIS));
closePanel.add(Box.createHorizontalGlue());
closePanel.add(closeButton);
closePanel.setBorder(BorderFactory.createEmptyBorder(0,0,5,5));
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(textArea, BorderLayout.CENTER);
contentPane.add(closePanel, BorderLayout.PAGE_END);
contentPane.setOpaque(true);
dialog.setContentPane(contentPane);
dialog.setSize(300, 130);
dialog.setLocationRelativeTo(parent);
dialog.setVisible(true);
}
}
可以从数据库中生成HTML字符串:
private static String formatInt(int amount) {
return new MessageFormat("{0,number}").format(new Object[]{amount});
}
private static String formatAmount(int amount) {
return new MessageFormat("{0,number,currency}").format(new Object[]{amount})
.replace(' ', '\u00a0');
}
公共静态字符串billHTML(){
StringBuilder sb=新的StringBuilder();
某人附加(“)
+ ""
+主体,h1,th,td{
+“字体系列:衬线;”
+“字体大小:12磅;”
+ "}"
+“h1{”
+“字体大小:20磅;”
+ "}"
+“表{”
//+“边界崩溃:崩溃;”
//+“边框样式:无;”
+ "}"
+“td,th{”
//+“边框:薄而实的灰色;”
+ "}"
+“th{”
+“边框底部:细实心灰色;”
+ "}"
+“.overline td{”
+“边框顶部:细纯灰;”
+ "}"
+ ""
+ "");
sb.附加(“-法案-”);
String sql=“从订单详细信息中选择*”;
try(PreparedStatement st=connection.prepareStatement(sql)){
try(ResultSet rs=st.executeQuery()){
某人附加(“)
+ ""
+“项目”
+“数量”
+“金额”
+ "");
int-total=0;
while(rs.next()){
某人附加(“)
+ "")
.append(rs.getString(“项”))
.append(“)
+ "")
.append(formatInt(rs.getInt(“数量”))
.append(“)
+ "")
.append(格式金额(rs.getInt(“成本”))
.append(“)
+ "");
总计+=卢比整(“成本”);
}
某人附加(“)
+ " ")
.append(“)
+ "")
.追加(“总额”)
.append(“)
+ "")
.追加(金额(合计))
.append(“)
+ ""
+ "");
}
}捕获(SQLE异常){
System.out.println(e.getMessage());
}
使某人返回字符串();
}
frame.getContentPane().setBackground(颜色:白色);
frame.getContentPane().setLayout(新的FlowLayout());
JLabel JLabel=新的JLabel(billHTML());
frame.add(jlabel);
代替附加链接,可以使用MessageFormat作为整个表行。
这是一个非常普遍的问题,您应该考虑阅读一些中间/高级Swing布局教程。请执行上面的代码,看看它是怎样的。并且想要一个标准的收据格式。在上面中间的名字和地址。右对齐的下一行日期和时间。那么,我们应该如何执行必须访问数据库才能产生输出的代码呢?另外,您对“标准收据”的描述也不是很清楚。以固定宽度字体或图片形式包含一个示例如何?请阅读JasperReports,您可以在其中使用所有必要的格式创建任何所需的报告1)提供GUI布局的ASCII艺术或简单绘图。2) 为了更快地获得更好的帮助,请发布一个(最少完整的可验证示例)。public static String billHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<html>"
+ "<style type='text/css'>"
+ "body, h1, th, td {"
+ " font-family: Serif;"
+ " font-size: 12pt;"
+ "}"
+ "h1 {"
+ " font-size: 20pt;"
+ "}"
+ "table {"
//+ " border-collapse: collapse;"
//+ " border-style: none;"
+ "}"
+ "td, th {"
//+ " border: thin solid gray;"
+ "}"
+ "th {"
+ " border-bottom: thin solid gray;"
+ "}"
+ ".overline td {"
+ " border-top: thin solid gray;"
+ "}"
+ "</style>"
+ "<body>");
sb.append("<h1>- BILL -</h1>");
String sql = "SELECT * FROM order_detail";
try (PreparedStatement st = connection.prepareStatement(sql)) {
try (ResultSet rs = st.executeQuery()) {
sb.append("<table width='650' cellspacing='0'>"
+ "<tr>"
+ "<th width='50%' align='left'>Item</th>"
+ "<th width='20%' align='right'>Quantity</th>"
+ "<th width='30%' align='right'>Amount</th>"
+ "</tr>");
int total = 0;
while (rs.next()) {
sb.append("<tr>"
+ "<td>")
.append(rs.getString("Item"))
.append("</td>"
+ "<td align='right'>")
.append(formatInt(rs.getInt("Quantity")))
.append("</td>"
+ "<td align='right'>")
.append(formatAmount(rs.getInt("Cost")))
.append("</td>"
+ "</tr>");
total += rs.getInt("Cost");
}
sb.append("<tr class='overline'>"
+ "<td> ")
.append("</td>"
+ "<td align='right'>")
.append("Total")
.append("</td>"
+ "<td align='right'>")
.append(formatAmount(total))
.append("</td>"
+ "</tr>"
+ "</table>");
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return sb.toString();
}
frame.getContentPane().setBackground(Color.WHITE);
frame.getContentPane().setLayout(new FlowLayout());
JLabel jlabel = new JLabel(billHTML());
frame.add(jlabel);