JTable, JTextArea или JEditorPane для выделения строк кода? - PullRequest
6 голосов
/ 07 марта 2012

Обновление:

Я нашел частичное решение в этом ответе здесь , добавив следующий код:

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());

Это работает правильно, и теперь строки таблицы окрашены в красный цвет:

Psuedocode Panel

Единственное, что мне нужно знать сейчасэто то, как ограничить раскраску одной строкой и одной ячейкой.

После дальнейших исследований мне нужен метод setCellRender(), чтобы я мог установить пользовательский рендеринг для конкретной ячейки, но этот методне существует.


Вопрос:

Я хочу создать визуальный компонент пошагового выполнения псевдокода.

Для этого я создал JTable, и теперь я ищу способы выделить каждую строку (или ячейку, поскольку имеется только один столбец), чтобы отобразить, какая строка выполняется.

IНиже приведен макет окончательного графического интерфейса.Как вы можете видеть на панели «Псевдокод», я выделил последнюю строку.

Пожалуйста, игнорируйте стрелки, они не связаны строго с вопросом.

Wireframe

Я начал реализовывать макет в Netbeans Matisse (это один из 3 алгоритмов).Однако я не знаю, как выделить одну строку code line 1 в компоненте JTable.

Было бы проще использовать компонент другого типа?

Позже мне также понадобитсячтобы можно было перекрасить отдельные ячейки, как показано в Таблице макета JPanel.Как это можно реализовать?

Partial implementation

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

1) используйте JTextPane для поддержки стилизованного текста, там у вас есть три варианта

  • используйте HighLighter

  • используйте Html форматированный текст (Java6 в текущей форме с поддержкой <= <code>Html3.2 и с уменьшенной поддержкой css, конечно по сравнению с Html5)

  • объединяет обе опции am вместе

  • написать собственный EditorKit или HtmlEditorKit (благодаря @stryba)

2) для JTable передать требуемое значение вprepareRenderer() вместо реализации getTableCellRendererComponent()

3) если значение для JSlider является изменяемым (из другого JComponents), тогда ищите BoundedRangeModel

2 голосов
/ 07 марта 2012

Небольшой код для вашей помощи, как добиться выделения конкретного текстового литерала с желаемым фоном на 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 TEXT HIGHLIGHTING

...