Cupom não Fiscal - Colunas

Como posso fazer com que o cupom não fiscal trabalhe com colunas?

Faço assim para montar os itens da venda:

for (ItemPedidoMOD item : itens) {
        stringItens.setText(stringItens + item.toString() + "\n");
}

// toString() do ItemPedidoMOD
this.getProduto().getNome() + "\t" + this.getProduto().getValorUnit().doubleValue() + "\t"
this.getQtd().doubleValue() + "\t" + this.getValorTotal().doubleValue();

Acontece que o \t nem sempre funciona caso um produto tenha um nome um pouco maior que os outros produtos…

Como posso resolver isso. Tem como trabalhar com colunas? Por exemplo, se um nome do produto for muito grande, os valores e a quantidade pulam para a linha de baixo mas continuam nas respectivas colunas…

@Rodrigo1895, você pode usar o String.format para fazer com que o texto do itemPedidoMOD obedeça um determinado comprimento. Na minha opinião, seria legal você manter um baixo acoplamento do código delegando a formatação dos dados para um outro método(formatarItemPedido no exemplo) ou classe. Assim você poderia reaproveitar sua classe de pedidos futuramente para uma implementação Web, Android, etc.

Segue código de exemplo:

class ItemPedidoMOD {

	private String nome;
	private double valorUnit;
	private double qtd;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public double getValorUnit() {
		return valorUnit;
	}

	public void setValorUnit(double valorUnit) {
		this.valorUnit = valorUnit;
	}

	public double getQtd() {
		return qtd;
	}

	public void setQtd(double qtd) {
		this.qtd = qtd;
	}

	public double getValorTotal() {
		return valorUnit * qtd;
	}
}

public class TextoColunas {

	// comprimento das colunas
	private static int COLUNA_NOME = 20;
	private static int COLUNA_VALOR_UNITARIO = 10;
	private static int COLUNA_QUANTIDADE = 10;
	private static int COLUNA_VALOR_TOTAL = 10;
	
	public static void main(String[] args) {
		
		ItemPedidoMOD pedido = new ItemPedidoMOD();
		pedido.setNome("nome muito longo, realmente, longo mesmo, com bastante caracteres");
		pedido.setQtd(10);
		pedido.setValorUnit(2.5);
		
		ItemPedidoMOD pedido2 = new ItemPedidoMOD();
		pedido2.setNome("nome curto");
		pedido2.setQtd(1);
		pedido2.setValorUnit(42);
		
		ItemPedidoMOD pedido3 = new ItemPedidoMOD();
		pedido3.setNome("nome razoavel");
		pedido3.setQtd(4);
		pedido3.setValorUnit(5);
		
		System.out.println(formatarItemPedido(pedido));
		System.out.println(formatarItemPedido(pedido2));
		System.out.println(formatarItemPedido(pedido3));
	}

	public static String formatarItemPedido(ItemPedidoMOD item) {
		StringBuilder sb = new StringBuilder();

		// determina numero de linhas do nome, arredondando pra cima
		int linhas = (int)Math.ceil(item.getNome().length() / COLUNA_NOME + 0.5);
		
		sb.append(wrap(padAlignLeft(item.getNome(), linhas * COLUNA_NOME - linhas),COLUNA_NOME));
		sb.append(padAlignRight(String.format("%5.2f", item.getValorUnit()), COLUNA_VALOR_UNITARIO));
		sb.append(padAlignRight(String.format("%5.2f", item.getQtd()), COLUNA_QUANTIDADE));
		sb.append(padAlignRight(String.format("%5.2f", item.getValorTotal()), COLUNA_VALOR_TOTAL));

		return sb.toString();
	}

	// preenche com espacos, alinha texto à esquerda
	public static String padAlignLeft(String s, int n) {
		return String.format("%-" + n + "s", s);
	}
	
	// preenche com espacos, alinha texto à direita
	public static String padAlignRight(String s, int n) {
		return String.format("%" + n + "s", s);
	}
	
	// quebra linha no comprimento determinado
	public static String wrap(String s, int comprimentoLinha) {
		StringBuilder sb = new StringBuilder(s);

		for(int i = comprimentoLinha; i < s.length(); i += comprimentoLinha){
			sb.insert(i - 1, "\n");
		}

		return sb.toString();
	}

}

Saída:

nome muito longo, r
ealmente, longo mes
mo, com bastante ca
racteres                 2,50     10,00     25,00
nome curto              42,00      1,00     42,00
nome razoavel            5,00      4,00     20,00

Abcs!

Vlw cara, vou estudar isso ai…

Mas depois que eu gerar todo o conteúdo que quero imprimir, posso enviar para qualquer tipo(marca/modelo) de impressora não fiscal?

Se a fonte for monospaced, acredito que sim, a saída será a mesma.