Java Swing JTextArea 行号
Java Swing JTextArea Line number
这个统计textarea的行数。代码工作正常,但是当 运行 此代码文本区域未激活时,插入符号被隐藏并且键盘
除非我点击文本区域,否则按键不起作用。
代码:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Element;
public class LineNumber extends JFrame implements DocumentListener {
private static final long serialVersionUID = -1093726028044203117L;
private JScrollPane scroll;
private JTextArea textArea, lineArea;
public static void main(String[] args) {
new LineNumber().setVisible(true);
}
public LineNumber() {
super("Line Numbers");
setSize(500, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setUI();
}
private void setUI() {
textArea = new JTextArea();
lineArea = new JTextArea(0, 3);
lineArea.setEditable(false);
lineArea.setForeground(Color.GRAY);
scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
textArea.getDocument().addDocumentListener(this);
scroll.setViewportView(textArea);
scroll.setRowHeaderView(lineArea);
getContentPane().add(scroll, BorderLayout.CENTER);
}
public void changedUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public void insertUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public void removeUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public String getLine() {
int caretPos = 0;
String lines;
caretPos = textArea.getDocument().getLength();
Element root = textArea.getDocument().getDefaultRootElement();
lines = String.format("%s%s", 1, System.lineSeparator());
for (int i = 2; i < root.getElementIndex(caretPos) + 2; i++) {
lines += String.format("%s%s", i, System.lineSeparator());
}
return lines;
}
}
如果我没有将 lineArea 添加到滚动窗格中,textarea 可以正常工作,但是在添加到 setRowHeaderView 之后,textarea 只能通过鼠标单击激活....
默认情况下它专注于第一个组件,因此如果您想专注于另一个组件,请在构造函数中尝试此代码。
addWindowFocusListener(new WindowAdapter() {
@Override
public void windowGainedFocus(WindowEvent e) {
textArea.requestFocusInWindow();
}
});
textArea
现在是焦点,more on this。
您可以使用以下方法防止行号文本区域获得焦点:
lineArea = new JTextArea(0, 3);
lineArea.setEditable(false);
lineArea.setFocusable(false);
您还可以查看 Text Component Line Number 以获得支持的更高级的实现:
- 换行文字
- 具有不同大小字体的文本(使用 JTextPane 时)
这个统计textarea的行数。代码工作正常,但是当 运行 此代码文本区域未激活时,插入符号被隐藏并且键盘
除非我点击文本区域,否则按键不起作用。
代码:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Element;
public class LineNumber extends JFrame implements DocumentListener {
private static final long serialVersionUID = -1093726028044203117L;
private JScrollPane scroll;
private JTextArea textArea, lineArea;
public static void main(String[] args) {
new LineNumber().setVisible(true);
}
public LineNumber() {
super("Line Numbers");
setSize(500, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setUI();
}
private void setUI() {
textArea = new JTextArea();
lineArea = new JTextArea(0, 3);
lineArea.setEditable(false);
lineArea.setForeground(Color.GRAY);
scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
textArea.getDocument().addDocumentListener(this);
scroll.setViewportView(textArea);
scroll.setRowHeaderView(lineArea);
getContentPane().add(scroll, BorderLayout.CENTER);
}
public void changedUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public void insertUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public void removeUpdate(DocumentEvent event) {
lineArea.setFont(textArea.getFont());
lineArea.setText(getLine());
}
public String getLine() {
int caretPos = 0;
String lines;
caretPos = textArea.getDocument().getLength();
Element root = textArea.getDocument().getDefaultRootElement();
lines = String.format("%s%s", 1, System.lineSeparator());
for (int i = 2; i < root.getElementIndex(caretPos) + 2; i++) {
lines += String.format("%s%s", i, System.lineSeparator());
}
return lines;
}
}
如果我没有将 lineArea 添加到滚动窗格中,textarea 可以正常工作,但是在添加到 setRowHeaderView 之后,textarea 只能通过鼠标单击激活....
默认情况下它专注于第一个组件,因此如果您想专注于另一个组件,请在构造函数中尝试此代码。
addWindowFocusListener(new WindowAdapter() {
@Override
public void windowGainedFocus(WindowEvent e) {
textArea.requestFocusInWindow();
}
});
textArea
现在是焦点,more on this。
您可以使用以下方法防止行号文本区域获得焦点:
lineArea = new JTextArea(0, 3);
lineArea.setEditable(false);
lineArea.setFocusable(false);
您还可以查看 Text Component Line Number 以获得支持的更高级的实现:
- 换行文字
- 具有不同大小字体的文本(使用 JTextPane 时)