java - Java JTextArea行号

标签 java swing jscrollpane jtextarea line-numbers

我试图将行号添加到JTextArea并遇到一些困难。行号出现,但是它们不能正确滚动。

我有一个自定义类的链接列表,该类存储一行数据(日志消息)和与之关联的行号,以及是否应在文本区域中显示它的可见性。因此,我要做的是创建两个JTextAreas ...一个用于存储日志,另一个用于存储行号。

布局有效,并且行号已正确填充日志。问题是当我尝试向上或向下滚动时。滚动时日志会正确调整,但行号却不会。除了最初显示的最初28行编号之外,没有任何显示。该空间只是空白。

我的代码如下:

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) { ... }
}


有任何想法吗?

谢谢,

最佳答案

您是否尝试过将两个文本字段都放在viewPort中?也许在面板上,使行号为可用宽度的一小部分?

关于java - Java JTextArea行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618136/

相关文章:

java - 用于更改卡片布局中卡片的按钮

java - Substance UI 和自定义 JComponent 的 TitledBorder 问题

java - 编辑或刷新 JList

Java Swing : Maximising a JTable display

java - 当 JTextArea 超过一定数量的行时启用滚动条

java - 如何在 Hibernate 中使用 Contains

java - 使用 ScriptObjectMirror 将数组结果从 JavaScript 转换为有用的东西

java - 将 JScrollpane 添加到包含多个 JPanel 的 JPanel

搜索查询中的 java.lang.NullPointerException

java - eXist-db 从同一集合的许多 XML 中获取数据