Lassen Sie JScrollPane mehrere Komponenten steuern

Für meine Anwendung entwerfe ich einen Skripteditor. Im Moment habe ich eineJPanel welches ein anderes enthältJPanel das hält die Zeilennummer (links positioniert), und aJTextArea Hiermit können Benutzer ihren Code eingeben (rechts positioniert).

Im Moment habe ich eine implementiertJScrollPane auf derJTextArea , damit der Benutzer durch seinen Code scrollen kann.

Für dieJPanel Sie werden mit den Zeilennummern jedes Mal erhöht, wenn der Benutzer die Eingabetaste drückt.

Das Problem ist jedoch, dass ich das gleiche JScrollPane haben möchte (das auf demJTextArea), um auch das Scrollen der Zeilennummer JPanel zu steuern; d.h., wenn der Benutzer in der JTextArea einen Bildlauf durchführt, sollte auch die Zeilennummer JPanel einen Bildlauf durchführen. Da die Zeilennummern jedoch in einem JPanel gespeichert sind, kann ich diese Komponente nicht zu einer JTextArea hinzufügen.

Der Konstruktor für die JPanel-Klasse, die die JTextArea und die Zeilennummer JPanel enthält:

private ScriptEditor() {

    setBackground(Color.WHITE);

    lineNumPanel = new LineNumberPanel();

    scriptArea = new JTextArea();
    scriptArea.setLineWrap(true);
    scriptArea.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 15));
    scriptArea.setMargin(new Insets(3, 10, 0, 10));

    JScrollPane scrollPane = new JScrollPane(scriptArea);
    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setPreferredSize(new Dimension(width, height));

    scriptArea.addKeyListener(this);

    add(lineNumPanel);
    add(scrollPane);
}

Der Konstruktor für die Zeilennummer JPanel, der JLabels in sich selbst hinzufügt, um die Zeilennummern darzustellen:

public LineNumberPanel() {

    setPreferredSize(new Dimension(width, height));

    box = Box.createVerticalBox();
    add(box);

    //setup the label
    label = new JLabel(String.valueOf(lineCount));
    label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 15));

    //setup the label alignment
    label.setVerticalAlignment(JLabel.TOP);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setVerticalTextPosition(JLabel.TOP);
    setAlignmentY(TOP_ALIGNMENT);

    box.add(label);
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage