Java JTable、JTextArea或JEditorPane突出显示代码行? 更新:

Java JTable、JTextArea或JEditorPane突出显示代码行? 更新:,java,swing,jtable,jtextcomponent,Java,Swing,Jtable,Jtextcomponent,通过添加以下代码,我在这个答案中找到了部分解决方案: class CustomRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c =

通过添加以下代码,我在这个答案中找到了部分解决方案:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}
然后将其传递给我的JTable对象:

jTable2.setDefaultRenderer(String.class, new CustomRenderer());
此操作正常,现在表格行显示为红色:

我现在唯一需要知道的是如何将着色限制为一行和一个单元格。

在进一步研究之后,我需要一个
setCellRender()
方法,这样我就可以在特定单元格上设置自定义渲染,但是这个方法不存在


问题: 我想创建一个分步伪代码执行的可视化组件

为此,我创建了一个JTable,现在我正在寻找高亮显示每一行(或单元格,因为只有一列)的方法,以显示正在执行的行

我在下面的最终GUI中加入了一个模型。正如您在伪代码面板中看到的,我突出显示了最后一行

请忽略箭头,它们与问题没有严格的关系。

我已经开始在Netbeans Matisse中实现模型(这是三种算法中的一种)。但是,我不知道如何突出显示JTable组件中的单行
代码行1

使用不同类型的组件会更容易吗

稍后,我还需要能够重新着色各个单元,如模型的表格JPanel中所示。如何实现这一点

1)用于支持样式化文本,有三种选择

  • 使用荧光灯


  • 使用
    Html
    格式化文本(当前格式的Java6)支持一个小代码以帮助您,如何在JTextPane上突出显示具有所需背景的特定文本文本:

    import java.awt.*;
    
    import java.awt.event.*;
    
    import javax.swing.*;
    
    import javax.swing.border.*;
    
    import javax.swing.text.AttributeSet;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyleContext;
    
    public class TextPaneTest extends JFrame
    {
        private JPanel topPanel;
        private JTextPane tPane;
    
        public TextPaneTest()
        {
            topPanel = new JPanel();        
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);            
    
            EmptyBorder eb = new EmptyBorder(new Insets(10, 10, 10, 10));
    
            tPane = new JTextPane();                
            tPane.setBorder(eb);
            //tPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
            tPane.setMargin(new Insets(5, 5, 5, 5));
    
            topPanel.add(tPane);
    
            appendToPane(tPane, "My Name is Too Good.\n", Color.RED, Color.YELLOW);
            appendToPane(tPane, "I wish I could be ONE of THE BEST on ", Color.BLUE, Color.WHITE);
            appendToPane(tPane, "Stack", Color.PINK, Color.WHITE);
            appendToPane(tPane, "Over", Color.YELLOW, Color.RED.brighter());
            appendToPane(tPane, "flow", Color.BLACK, Color.GREEN.darker());
    
            getContentPane().add(topPanel);
    
            pack();
            setVisible(true);   
        }
    
        private void appendToPane(JTextPane tp, String msg, Color c, Color bColor)
        {
            StyleContext sc = StyleContext.getDefaultStyleContext();
            AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
    
            aset = sc.addAttribute(aset, StyleConstants.Background, bColor);
            //  aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
    
            aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
            aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);
    
            int len = tp.getDocument().getLength();
            tp.setCaretPosition(len);
            tp.setCharacterAttributes(aset, false);
            tp.replaceSelection(msg);
        }
    
        public static void main(String... args)
        {
            SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        new TextPaneTest();
                    }
                });
        }
    }
    
    以下是输出:


    只需在第1点中添加一个选项,您还可以使用自己的
    视图创建自己的
    编辑器IT
    ,这是一项更大的工作,但通常优于其他options@stryba感谢您的通知,对于所有EditorKit或HtmlEditorKit相关问题,hmmm有我们的(JTextComponent's King@StanislavL),-1代表2)(是时候开始对这个不太正确的建议进行调查了:-)这不是在应用程序代码中实现可视单元格装饰的一般方法,而是自定义渲染器。基本规则是:永远不要为应用程序需求扩展JSomething,它们应该按原样使用。也就是说:使用附加功能扩展核心组件(在此上下文中,f.i.添加api以允许自定义条带化)很好:这允许在所有应用程序中重复使用扩展组件,而无需进一步扩展,他们可以根据需要配置自定义组件。这个答案和上面的注释让我有点困惑。我假设我应该在自定义类中扩展JTable并覆盖
    prepareRenderer()
    method。我还应该承认,我对Java Swing没有很好的经验。1)也许最好等待@kleopatra的回复,2)这条评论是关于
    传递期望值
    的,并确保基本上她的诚实是真实的,而且非常有价值,如果你对Swing有所了解,3)我必须注意,如果不使用a编辑您的问题,就不可能回答您的问题。4)我仅将此问题作为面试,谢谢您的回答。虽然这解决了我在
    计算区域中遇到的另一个问题,但它仍然没有解决我在给JTable单元格着色时遇到的问题。@Ash:Ahhh。。。希望我能在
    JTable
    s上帮助你,但我对它们的了解太少了。对此我很抱歉。但是希望这个答案能在你的努力中对你有所帮助,希望你能很快找到答案:-)我可以在特定的单元格上设置自定义渲染-不,这不是你需要的:-)取而代之,您需要一个自定义渲染器,该渲染器根据传递到GetXXCellRenderComponent的参数决定其渲染组件的视觉效果,请参见f.i.i.see。因此,我将自定义渲染器设置为所有单元格,然后检查自定义渲染器方法中需要高亮显示的单元格?我仍然不知道如何在自定义渲染器方法中检查我所在的单元格。我不理解您不理解的内容;-)该方法的参数告诉您需要知道的一切。您确实阅读了我上面链接的教程,不是吗?如果我在我的
    gettableCellRenderComponent
    method-
    If(column==0&&row==1)c.setBackground(new java.awt.Color(255,72,72))中执行条件语句它仍然将所有单元格涂成红色。