Frage

Ich versuche, Zeilennummern zu einem JTextArea hinzuzufügen und einige Schwierigkeiten habe. Die Zeilennummern erscheinen, aber sie nicht richtig bewegen.

Ich habe eine verknüpfte Liste einer benutzerdefinierten Klasse, die speichert eine Datenzeile (Protokollmeldung) und eine Leitung Nummer zugeordnet sowie Sichtbarkeit auf, ob es in dem Textbereich angezeigt werden soll oder nicht. Also, was ich tat, war zwei JTextAreas schaffen ... man die Protokolle zu speichern, und die andere die Zeilennummern zu speichern.

Das Layout funktioniert und die Zeilennummern füllen korrekt mit den Protokollen. Das Problem ist, wenn ich versuche, um nach oben oder nach unten. Die Protokolle richtig einstellen, wie Sie bewegen, aber die Zeilennummern nicht. Nichts zeigt darüber hinaus die ersten 28 Zeilennummern, die ursprünglich angezeigt werden. Der Raum ist einfach leer.

Mein Code ist unten:

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

Irgendwelche Ideen?

Danke,

War es hilfreich?

Lösung

Haben Sie versucht, im Ansichtsfenster beiden Textfelder setzen? Vielleicht auf einem Panel, dass den Zeilennummern einen Bruchteil der zur Verfügung stehenden Breite gibt?

Andere Tipps

Das compenent verwendet, um die Zeilennummern angezeigt werden kann hinzugefügt werden:

scrollPane.setRowHeaderView(...);

Eine andere Möglichkeit ist es, eine JTable zu verwenden beide Spalten angezeigt werden soll. zwei Textbereiche zu verwenden ist wirklich nicht die beste Lösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top