6

更新:

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

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 上包含了一个模型。正如您在 Pseudocode 面板中看到的那样,我突出显示了最后一行。

请忽略它们与问题不严格相关的箭头。

线框

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

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

稍后我还需要能够重新着色单个单元格,如模型的 Table JPanel 中所示。如何实施?

部分实施

4

2 回答 2

3

1) 使用JTextPane支持样式文本,你有三个选择

  • 利用HighLighter

  • 使用Html格式化文本(当前形式的 Java6 支持 <=Html3.2并且减少了对 css 的支持,肯定与 相比Html5

  • 将两个 am 选项结合在一起

  • 编写自己的 EditorKit 或 HtmlEditorKit(感谢@stryba)

2)对于JTable传递所需的值prepareRenderer()而不是实现getTableCellRendererComponent()

3) 如果JSlider的值是可修改的(来自另一个 JComponents),则查找BoundedRangeModel

于 2012-03-06T21:31:41.577 回答
2

帮助您的小代码,如何实现在 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();
                }
            });
    }
}

这是输出:

JTEXTPANE 文本突出显示

于 2012-03-07T04:58:30.710 回答