У меня есть свинг gui с JTextPane для вывода журнала из базового приложения. Моя проблема заключается в том, что после инициализации gui и регистрации первых записей журнала полоса прокрутки «отключена», пока я не инициирую действие. После следующих записей в журнале «горизонтальный» скроллер «появляется».
Вторая проблема заключается в том, что иногда случается, что лог-оператор имеет длину 1030 символов. Но горизонтальная прокрутка максимальна для 606 символов. Если я копирую текст из JTextPane, я получаю текст дырки (1030 символов).
Я попытался в MainFrame logTxtArea.setText ("... -> 1030 символов ..."); << - скроллер работает должным образом, а также отображаются записи журнала. </p>
Вот мой код инициализации JTestPane в мейнфрейме
private static JTextPane logTxtArea = new JTextPane();
......
logTxtArea.setEditable(false);
logTxtArea.setEditorKit(new NoWrapEditorKit());
JScrollPane logScroller = new JScrollPane(logTxtArea);
logScroller.setFont(new Font("Segoe UI", Font.PLAIN, 12));
logScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
logScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.SOUTHWEST;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 8;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(10, 15, 10, 5);
gbc.weightx = 1;
gbc.weighty = 1;
main.add(logScroller, gbc);
И мой NoWrapEditorKit ->
public class TextAreaAppender extends AppenderSkeleton {
private static Style style;
protected void append(LoggingEvent event) {
this.layout = new PatternLayout("%d - %m%n");
String msg = this.layout.format(event);
JTextPane textArea = MainFrame.getLogTxtArea();
Color color = Color.BLACK;
if (event.getLevel() == Level.INFO) {
color = Color.BLUE;
} else if (event.getLevel() == Level.WARN || event.getLevel() == Level.ERROR || event.getLevel() == Level.FATAL) {
color = Color.RED;
}
if (msg.contains("INFO:")) {
color = Color.MAGENTA;
}
appendToPane(textArea, msg, color);
MainFrame.getLogTxtArea().setCaretPosition(MainFrame.getLogTxtArea().getDocument().getLength());
}
public void close() {
}
public boolean requiresLayout() {
return false;
}
private void appendToPane(JTextPane tp, String msg, Color c) {
int len = tp.getDocument().getLength();
if (style == null) {
style = tp.addStyle("", null);
}
try {
StyleConstants.setForeground(style, c);
tp.getStyledDocument().insertString(len, msg, style);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
}
Таким образом, цель состоит в том, чтобы получить отчет по каждой строке без переноса строки. Также очень длинные операторы (1030 символов) должны отображаться завершенными.
Спасибо!
ОБНОВЛЕНИЕ
Вот краткий пример:
public class TextFrame extends JFrame {
private JTextPane txtPane;
private Style style;
public TextFrame() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
this.setMinimumSize(new Dimension(600, 400));
this.setPreferredSize(new Dimension(900, 600));
txtPane = new JTextPane()
{
public boolean getScrollableTracksViewportWidth()
{
return getUI().getPreferredSize(this).width
<= getParent().getSize().width;
}
};
txtPane.setEditable(false);
JScrollPane logScroller = new JScrollPane(txtPane);
logScroller.setFont(new Font("Segoe UI", Font.PLAIN, 12));
logScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
logScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
this.add(logScroller);
append("Short text" + System.lineSeparator(), Color.BLACK);
append("1030 char text - 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz12345" + System.lineSeparator(), Color.BLACK);
append("2000 char text - 1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz123" + System.lineSeparator(), Color.BLACK);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void append(String message, Color color) {
int len = txtPane.getDocument().getLength();
if (style == null) {
style = txtPane.addStyle("", null);
}
try {
StyleConstants.setForeground(style, color);
txtPane.getStyledDocument().insertString(len, message, style);
} catch (BadLocationException e) {
e.printStackTrace();
}
//scroll to bottom
txtPane.setCaretPosition(txtPane.getDocument().getLength());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
new TextFrame();
}
});
}
}