【问题标题】:Java JTextArea Line NumbersJava JTextArea 行号
【发布时间】:2011-01-06 18:06:51
【问题描述】:

我正在尝试将行号添加到 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) { ... }
}

有什么想法吗?

谢谢,

【问题讨论】:

    标签: java swing jscrollpane jtextarea line-numbers


    【解决方案1】:

    您是否尝试将两个文本字段都放在视口中?也许在一个面板上给出了可用宽度的一小部分行号?

    【讨论】:

    • 我不知道滚动窗格可以有多个视口?我确实尝试通过添加scrollPane.getViewport().add(lineField);lineField 添加到滚动窗格视口,但这消除了窗口中的所有文本区域。看起来创建它们时出现了某种错误。
    • 哦,我误解了你的评论。我现在试着把它们放在一个面板上,让你知道它是怎么回事。
    • 确实有效。我将不得不在边框和插入方面对其进行一些清理,但是滚动条可以正常工作并且行号会正确填充。谢谢!
    【解决方案2】:

    可以使用以下命令添加用于显示行号的组件:

    scrollPane.setRowHeaderView(...);
    

    另一种选择是使用 JTable 来显示两列。使用两个文本区域确实不是最好的解决方案。

    【讨论】:

    • 是的,我在他的代码中看到他正在调用 setRowHeaderView,但它没有按照他需要的方式工作,所以我建议了两个文本区域。我认为 JTable 可能是最好的解决方案。
    • 实际上我确实转移到了 JTable 并且它工作得更好。我现在遇到的问题是当我调用fireTableCellUpdated(0, getRowCount()); 时,表格行没有更新@ 尚不知道具体原因。
    • @njozwiak,我看到了两个问题。首先,参数应该是(行,列)。您正在提供(行,行)。其次,参数是从零开始的,所以最后一个单元格实际上是 getRowCount() - 1。
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多