auto rolagem de JEditorPane
-
07-07-2019 - |
Pergunta
Eu estou usando um JEditorPane como um editor de comentários de escrita em meu aplicativo. O tipo de conteúdo está definido "text / plain". Quando estou escrevendo texto nele eo texto preenche o espaço disponível e eu vou em digitação, o texto não está se movendo para cima, para mostrar o cursor. Então, eu não sei onde estou escrevendo eo que eu sou digitação, já que seria visível.
Você poderia me dizer como mostrar sempre o acento circunflexo, movendo o texto acima para cima?
Em vez disso, poderia ser melhor se eu posso auto-redimensionar o editor como eu sou digitação. O JEditorPane está dentro de um JPanel, então eu tenho que redimensionar isso também. alguma idéia?
Solução
Você precisa colocar o editor dentro de um JScrollPane. O ScrollPane irá adicionar automaticamente as barras de rolagem e remover a necessidade de redimensionar o editor.
Outras dicas
editado para adicionar solução completa ??p>
Você tem que adicionar um JScrollPane primeiro. Então, se você não quer que as barras de rolagem para ser visível, mas você quer área de texto para autoscroll, set
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
no painel de rolagem. Isto irá ocultar as barras de rolagem, mas fornecê-lo com deslocamento automático.
Veja como você implementar auto rolagem com painel de rolagem e redimensionamento automático até um determinado máximo.
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class SPTest extends JFrame {
private static final long serialVersionUID = 1L;
private JEditorPane editor;
private JScrollPane scrollPane;
private JPanel topPanel;
private JLabel labelTop;
public SPTest() {
super("Editor test");
initComponents();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void initComponents() {
editor = new JEditorPane("text/plain", null);
scrollPane = new JScrollPane(editor);
topPanel = new JPanel();
labelTop = new JLabel("main contents here");
topPanel.add(labelTop);
setSize(600, 400);
editor.setMinimumSize(new Dimension(100, 30));
editor.setPreferredSize(new Dimension(100, 60));
scrollPane.setPreferredSize(new Dimension(600, 60));
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane.setMinimumSize(new Dimension(100, 30));
final int MAX_HEIGHT_RSZ = 120;
editor.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
int height = Math.min(editor.getPreferredSize().height, MAX_HEIGHT_RSZ);
Dimension preferredSize = scrollPane.getPreferredSize();
preferredSize.height = height;
scrollPane.setPreferredSize(preferredSize);
SPTest.this.validate();
}
});
setLayout(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new SPTest();
}
}
Você pode redimensionar Você pode usar este JScrollPane em vez dos JPanel como o recipiente para o editor.