I numeri Java JTextArea Linea
-
30-09-2019 - |
Domanda
Sto cercando di aggiungere numeri di riga a un JTextArea e sto avendo qualche difficoltà. I numeri di riga appaiono, ma non scorrono correttamente.
ho una lista concatenata di una classe personalizzata che memorizza una riga di dati (messaggio di registro) e un numero di riga ad esso associati, nonché visibilità sul se debba essere visualizzato nell'area di testo oppure no. Quindi quello che ho fatto è stato creare due JTextAreas ... uno per archiviare i log, e l'altro per memorizzare i numeri di riga.
Il layout funziona ei numeri di riga popolano correttamente con i registri. Il problema è quando provo a scorrere verso l'alto o verso il basso. I registri regolare correttamente come lo scorrimento, ma i numeri di riga non lo fanno. mostra nulla oltre i numeri 28 riga iniziali che sono mostrati inizialmente. Lo spazio è solo vuoto.
Il mio codice è qui sotto:
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) { ... }
}
Tutte le idee?
Grazie,
Soluzione
Hai provato mettendo entrambi i campi di testo nella finestra? Forse su un pannello che dà i numeri di riga una frazione della larghezza disponibile?
Altri suggerimenti
Il compenent utilizzato per visualizzare i numeri di riga possono essere aggiunti utilizzando:
scrollPane.setRowHeaderView(...);
Un'altra opzione è quella di utilizzare un JTable per visualizzare entrambe le colonne. L'uso di due aree di testo non è davvero la soluzione migliore.