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);
}