Hi,
Vorab: Ich habe noch nicht viel Erfahrung mit GUI-Programmierung, also bitte nicht schlagen!
Ich möchte für meinen Editor in einem JScrollPane die Zeilennummern anzeigen lassen. Allerdings möchte ich auch, dass bei Bedarf einzelne Zeilennummern durch Symbole ersetzt werden können. Diese Symbole sollen dann auch Tooltips enthalten und auf Mausklicks reagieren können. Dafür benutze ich ein JPanel, bei dem nach Änderung der Zeilenanzahl die folgende Methode aufgerufen wird:
Im Prinzip fügt sie also neue LineHeader (JLabels) hinzu oder entfernt sie, jenachdem wie sich die Zeilenanzahl geändert hat.
Das funktioniert aber nur so lange, bis gescrollt werden muss: Scrollt man an den oberen Rand, sieht man alle Labels korrekt, scrollt man weiter runter, werden sie plötzlich nicht mehr angezeigt. Ich denke das liegt daran, dass sich das Panel nicht automatisch vergrößert (ein Aufruf von getSize() bestätigt das), also hab ich einfach in die Funktion changeLineCunt() einen setSize() Aufruf gepackt, der die Höhe des Headers an die Höhe des Viewports anpasst. Leider hat das am Problem trotzdem nichts geändert: Die Labels werden nur bis zum unteren Rand angezeigt, wenn ganz nach oben gescrollt wurde.
Was mache ich falsch?
Danke im Voraus!
Vorab: Ich habe noch nicht viel Erfahrung mit GUI-Programmierung, also bitte nicht schlagen!
Ich möchte für meinen Editor in einem JScrollPane die Zeilennummern anzeigen lassen. Allerdings möchte ich auch, dass bei Bedarf einzelne Zeilennummern durch Symbole ersetzt werden können. Diese Symbole sollen dann auch Tooltips enthalten und auf Mausklicks reagieren können. Dafür benutze ich ein JPanel, bei dem nach Änderung der Zeilenanzahl die folgende Methode aufgerufen wird:
Java:
public void changeLineCount(int newval) {
if (newval < lastLineCount) {
// Remove some lines
for (int i = newval ; i < lastLineCount ; i++) {
remove(i);
}
} else {
// Add some lines
Element root = target.getDocument().getDefaultRootElement();
TextUI targetUI = target.getUI();
int start = lastLineCount == -1 ? 0 : lastLineCount;
for (int i = start ; i < newval ; i++) {
Element lElem = root.getElement(i);
int offset = lElem.getStartOffset();
Rectangle lineRect = null;
try {
lineRect = targetUI.modelToView(target, offset);
lineRect.width = (int) getSize().getWidth();
} catch (BadLocationException ex) {
ex.printStackTrace();
}
LineHeader header = null;
if (headers.size() > i) {
header = headers.get(i);
}
if (header == null) {
header = new DefaultLineHeader();
headers.add(header);
}
header.setBounds(lineRect);
header.setLine(i);
header.shown();
add(header);
}
}
lastLineCount = newval;
repaint();
}
Im Prinzip fügt sie also neue LineHeader (JLabels) hinzu oder entfernt sie, jenachdem wie sich die Zeilenanzahl geändert hat.
Das funktioniert aber nur so lange, bis gescrollt werden muss: Scrollt man an den oberen Rand, sieht man alle Labels korrekt, scrollt man weiter runter, werden sie plötzlich nicht mehr angezeigt. Ich denke das liegt daran, dass sich das Panel nicht automatisch vergrößert (ein Aufruf von getSize() bestätigt das), also hab ich einfach in die Funktion changeLineCunt() einen setSize() Aufruf gepackt, der die Höhe des Headers an die Höhe des Viewports anpasst. Leider hat das am Problem trotzdem nichts geändert: Die Labels werden nur bis zum unteren Rand angezeigt, wenn ganz nach oben gescrollt wurde.
Was mache ich falsch?
Danke im Voraus!