@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!