Pregunta

Estoy tratando de añadir números de línea a un JTextArea y estoy teniendo algunas dificultades. Los números de línea aparecen, pero no se desplazan correctamente.

Tengo una lista vinculada de una clase personalizada que almacena una línea de datos (mensaje de registro) y un número de línea asociado a él, así como la visibilidad de si se debe mostrar en el área de texto o no. Así que lo que hice fue crear dos JTextAreas ... uno para almacenar los registros, y el otro para almacenar los números de línea.

El diseño funciona y los números de línea rellenar correctamente con los registros. El problema es cuando intento para desplazarse hacia arriba o hacia abajo. Los registros se ajustan adecuadamente mientras se desplaza, pero los números de línea no lo hacen. no muestra nada más allá de los números 28 de línea iniciales que se muestran inicialmente. El espacio es sólo en blanco.

Mi código es el siguiente:

public class CustomLineNumbers extends JFrame implements ActionListener
{    
    ...
    private JTextArea logField;
    private JTextArea lineField;

    private List<Log> logs;

    public CustomLineNumbers() 
    {       
        ...
        logs = new ArrayList<Log>();

        logField = new JTextArea(28, 68);
        logField.setMargin(new Insets(0, 5, 0, 0));
        logField.setEditable(false);
        logField.setLineWrap(true);
        logField.setWrapStyleWord(true);

        lineField = new JTextArea();
        lineField.setPreferredSize(new Dimension(25, 0));
        lineField.setBackground(this.getForeground());
        lineField.setBorder(OUTER);
        lineField.setEditable(false);

        initLogs();
        updateLogView();
        updateLineView();

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.getViewport().add(logField);
        scrollPane.setRowHeaderView(lineField);
        scrollPane.setVertical...Policy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

        ...
    }

    private void initLogs()
    {
        // inits the data in the list
    }

    public void updateLogView()
    {
        logField.setText("");   // reset log field to nothing

        for (int i = 0; i < logs.size(); i++)
        {
            // Append only if the line is visible
            if (logs.get(i).getVisibility())
            {
                // if this isn't the first line, 
                // add a line break before appending
                if (i > 0)
                    logField.append("\n");  

                logField.append(logs.get(i).getLine());
            }
        }       
    }

    public void updateLineView()
    {
        lineField.setText("");  // reset log field to nothing

        for (int i = 0; i < logs.size(); i++)
        {
            // Append only if the line is visible
            if (logs.get(i).getVisibility())
            {
                // if this isn't the first line, 
                // add a line break before appending
                if (i > 0)
                    lineField.append("\n"); 

                lineField.append("" + logs.get(i).getLineNumber());
            }
        }       
    }

    ...

    /***** Main Execution *****/
    public static void main(String[] args) { ... }
}

¿Alguna idea?

Gracias,

¿Fue útil?

Solución

¿Usted ha intentado poner los dos campos de texto en la ventana? Tal vez en un panel que da a los números de línea una fracción de la anchura disponible?

Otros consejos

El compenent utilizado para mostrar los números de línea se puede añadir usando:

scrollPane.setRowHeaderView(...);

Otra opción es utilizar un JTable para mostrar ambas columnas. El uso de dos áreas de texto no es realmente la mejor solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top