entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Refrescar o sobreescribir una linea concreta en JTextArea

Hola Amigos, estoy trabajando con Sockets y java swing con un programa que agrega a un textarea lineas de un pedido de productos, desde el hilo servidor de mi aplicación recibo las lineas de pedido a mi cliente, pero no consigo sobreescribir las lineas de pedido que se repiten, intento borrar el JTextArea con .textArea.setText("") y luego lo añado con append, pero se me añaden al lado las lineas no se me sobreescriben también lo he intentado con replaceRange y replace pero no me funciona, les adjunto la imagen de mi aplicacion, gracias por su ayuda, un saludo.

http://subefotos.com/ver/?1f7396e17c9e32a54146e86e2870fc69o.jpg

0voto

white comentado

Intenta agregar tu codigo, especificamente donde defines tu JTextarea y donde intentas cambiar su contenido.

0voto

javierek89 comentado

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.BadLocationException;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JComboBox;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.StringTokenizer;

import javax.swing.JTextArea;
import javax.swing.JScrollBar;
import javax.swing.DropMode;

public class Cliente extends JFrame {

    private JPanel contentPane;
    static JComboBox cbxproductos = new JComboBox();
    static JTextArea textArea;
    JScrollPane scrollBar;
    static Socket cliente;
    static String productos[]; 
    static double precios[];
    static Lineasdepedido d,d2;
    static int puerto=6000;
    static String host="localhost";
    JPanel panel;
    static JButton btnEnviar;
    static JButton btnCancelar;
    static JButton btnFinalizar;

    static ObjectInputStream fentrada;
    static ObjectOutputStream fsalida;
    static JTextField txtCantidad;
    static double acumulador=0;

    /**
     * Launch the application.
     */
    public static void main(String[] args)throws IOException  {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Cliente frame = new Cliente();
                    frame.setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        try{
         cliente=new Socket(host,puerto);
        }catch(IOException i){

            System.exit(0);
        }

        try{
            fsalida=new ObjectOutputStream(cliente.getOutputStream());
            fentrada=new ObjectInputStream(cliente.getInputStream());
            //productos= (String[]) fentrada.readObject();
            productos = (String[]) fentrada.readObject();
            System.out.println("**"+productos[0]);
            cbxproductos.addItem("Elige productos...");
            for(int i=0;i<productos.length;i++){

                System.out.println("**"+productos[i]);
                cbxproductos.addItem(productos[i]);
            }

            }catch(IOException | ClassNotFoundException io){
                io.printStackTrace();

            }

        try {

            String patron2 = " %-15s %-15s %-15s %-15s";
            textArea.append("============================================================\n");
            String cabezera= String.format(patron2," PRODUCTO "," CANT "," PVP "," IMPORTE ");
            textArea.append(cabezera);
            textArea.append("\n==========================================================");
            while(true){

            d = (Lineasdepedido)fentrada.readObject();
            //d2 = (Lineasdepedido)fentrada.readObject();
            acumulador=acumulador+d.getImporte();

             System.out.println(" * "+d.getProducto()+" * "+d.getCantidad()+" * "+d.getPrecio()+" * "+d.getImporte());
             String proyet0 = (String) cbxproductos.getSelectedItem(); 

             //String proyet0 = (String) cbxproductos.getSelectedItem(); 
             String patron = " %-15s %3d %7.2f %7.2f";
             String resultado = String.format(patron2,
             d.getProducto(), d.getCantidad(),
             d.getPrecio(), d.getImporte());
             textArea.append("\n"+resultado);

            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

0voto

javierek89 comentado

Exactamente en el try seguido de String patron, he probado a reemplazar y nada

1 Respuesta

1voto

white Puntos75880

Si entendi bien, lo que quieres es reemplazar una linea del JTextarea me parece que seria la ultima para poder reemplazarla con otros valores, manteniedo la cabecera. Intenta obteniendo la ultima linea y su posicion inicial como su posicion final.

para reemplazar la ultima linea:

int last = textArea.getLineCount() - 1;
int start = textArea.getLineStartOffset(last);
int end = textArea.getLineEndOffset(last);

textArea.replaceRange(resultado, start, end);

eso reemplazaria la ultima linea con el contenido de la cadena resultado, solo por curiosidad, por que no usas la clase JTable? me parece que seria mas comodo al agregar valores.

0voto

javierek89 comentado

Hola probe a usar lo que me pusistes pero solo me remplaza la primera linea o la ultima y en mi caso tiene que ser una linea concreta del JTextArea, en este caso la que se repita , un saludo.

0voto

white comentado

intenta recorriendo todas las lineas y buscando las repetidas, crea un array de elementos únicos.

public void removeDuplicatedLines()
{
    String content = textArea.getText();
    String rawLines[] = textArea.getText().split("\\r?\\n");

    // TODO: un mejor metodo para detectar el header del
    //       textarea
    if(content.startsWith("==="))
    {
        rawLines = Arrays.copyOfRange(rawLines, 3, rawLines.length);
    }

    Set<String> set = new LinkedHashSet<String>(Arrays.asList(rawLines));
    ArrayList<String> lines = new ArrayList<>();
    StringBuilder output = new StringBuilder();

    // el header del textarea
    StringBuilder header = new StringBuilder();

    header.append("===========================\r\n");
    header.append(String.format(
            "%-15s %-15s %-15s %-15s\r\n"," PRODUCTO "," CANT "," PVP "," IMPORTE "));
    header.append("===========================\r\n");

    for(Object line : set.toArray())
    {
        output.append((String) line + "\r\n");
    }

    textArea.setText(header.toString());
    textArea.append(output.toString());
}

textArea es tu JTextArea, la idea es que llames a removeDuplicatedLines cada vez que actualizes tu JTextarea con nuevas lineas, que sería despues del while:

while(true) {
    d = (Lineasdepedido)fentrada.readObject();
    ...
}

removeDuplicatedLines();

Talvez lo mejor es que crees un HashMap que tenga como claves los nombres de los productos y como valor un arreglo de los precios, pero insisto en que lo mejor sería una tabla.

PD: agrege la condicional if(content.startsWith("===")) para saber si el textarea tiene ya el header

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta