通过添加以下代码,我在此答案here中找到了部分解决方案:
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
。
使用不同类型的组件会更容易吗?
稍后我还需要能够重新着色单个单元格,如模型的表格JPanel中所示。如何实施?
答案 0 :(得分:3)
1)使用JTextPane来支持样式文字,你有三个选择
使用HighLighter
使用Html
格式化的文本(当前形式的Java6支持< = Html3.2
并减少对css的支持,确保与Html5
相比)
将两个a.m.选项合并在一起
编写自己的EditorKit或HtmlEditorKit(感谢@stryba)
2)JTable将所需值传递给prepareRenderer()
而非实施getTableCellRendererComponent()
3)如果JSlider的值可修改(来自其他JComponents),则查找BoundedRangeModel
答案 1 :(得分: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();
}
});
}
}
这是输出: