Question

Je suis en train d'ajouter des numéros de ligne à un JTextArea et je rencontre quelques difficultés. Les numéros de ligne apparaissent, mais ils ne défilent pas correctement.

J'ai une liste chaînée d'une classe personnalisée qui stocke une ligne de données (message de journal) et un numéro de ligne associé ainsi que la visibilité si elle doit apparaître dans la zone de texte ou non. Donc, ce que je faisais était de créer deux JTextAreas ... un pour stocker les journaux, et l'autre pour stocker les numéros de ligne.

La mise en page fonctionne et les numéros de ligne correctement renseigné avec les journaux. Le problème est quand j'essaie de défiler vers le haut ou vers le bas. Les journaux ajustent correctement lorsque vous faites défiler, mais les numéros de ligne ne le font pas. Rien ne montre au-delà des chiffres initiaux 28 lignes qui apparaissent d'abord. L'espace est juste vide.

Mon code est ci-dessous:

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) { ... }
}

Toutes les idées?

Merci,

Était-ce utile?

La solution

Avez-vous essayé de mettre les deux champs de texte dans la fenêtre d'affichage? Peut-être sur un panneau qui donne les numéros de ligne une fraction de la largeur disponible?

Autres conseils

Le compenent utilisé pour afficher les numéros de ligne peut être ajouté à l'aide:

scrollPane.setRowHeaderView(...);

Une autre option consiste à utiliser un JTable pour afficher les deux colonnes. L'utilisation de deux zones de texte est vraiment pas la meilleure solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top