5

1つの列に次の形式で値が表示されるJTableがあります。

423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]

角かっこ内の値を赤で表示できるかどうか疑問に思っていますか?

私はここ数日グーグルしていて、セルの「背景」を設定する方法を示すいくつかの例を見つけましたが、特にテキストの特定の部分ではなく、セルのフォントを変更する方法は実際にはありません。

public class myTableCellRenderer
       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);

    if (column == 3) {
       c.setForeground(Color.YELLOW);
       c.setBackground(Color.RED);
    }
    return c;
  }

テキストの一部を別の色(つまり、角かっこ内にあるテキスト)に変更することは本当に可能ですか?

編集

例として示したテキストは、テーブルセルに表示されている実際のテキストです(コンマ区切り文字は列を表していません)。セルに表示されるテキストは、列3のテーブルに表示されるコンマ区切りの文字列です。

例として、テーブルは次のようになります。

product_id |product_name| invoice_numbers
12         |    Books   | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
323        |    Videos  | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
4434       |    Music   | 423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]
4

4 に答える 4

5

HTML と組み合わせたセル レンダラーを使用する必要があります。

ここに小さなデモの例があります:

import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestTable2 {

    class MyCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (value instanceof String) {
                String string = (String) value;
                if (string.indexOf('[') > -1) {
                    setText(getHTML(string));
                }
            }
            return tableCellRendererComponent;
        }

        private String getHTML(String string) {
            StringBuilder sb = new StringBuilder();
            sb.append("<html>");
            int index = 0;
            while (index < string.length()) {
                int next = string.indexOf('[', index);
                if (next > -1) {
                    int end = string.indexOf(']', next);
                    if (end > -1) {
                        next++;
                        sb.append(string.substring(index, next));
                        sb.append("<span style=\"color: red;\">");
                        sb.append(string.substring(next, end));
                        sb.append("</span>");
                        index = end;
                    } else {
                        break;
                    }
                } else {
                    break;
                }
            }
            sb.append(string.substring(index, string.length()));
            sb.append("</html>");
            return sb.toString();
        }
    }

    protected void initUI() {
        DefaultTableModel model = new DefaultTableModel();
        for (int i = 0; i < 2; i++) {
            model.addColumn("Col-" + (i + 1));
        }
        for (int i = 0; i < 200; i++) {
            Vector<Object> row = new Vector<Object>();
            for (int j = 0; j < 5; j++) {
                row.add("423545(50),[7568787(50)],53654656,2021947(50),[021947],2021947(50),[8021947(50)]");
            }
            model.addRow(row);
        }
        JTable table = new JTable(model);
        table.setDefaultRenderer(Object.class, new MyCellRenderer());
        JFrame frame = new JFrame(TestTable2.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane scrollpane = new JScrollPane(table);
        frame.add(scrollpane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable2().initUI();
            }
        });
    }

}

そして結果:

結果

于 2013-01-27T12:04:44.680 に答える
2

これはあなたが探しているものですCell render

どうやって進める:

  1. getTableCellRendererComponent()関数を適切なパラメータとともに使用して、デフォルトのセル レンダリング コンポーネントを取得し ます。

  2. セルのテキストを解析し、setForeground()関数を使用してフォーマットを適用します。

于 2013-01-27T11:57:19.700 に答える
2
Is it really possible to change part of the text to be a different color

はい、可能です。

  • JTextField/JTextArea asで簡単な蛍光ペンが可能ですRenderers component

  • としてHighlighter探す必要があるの倍数JTextPaneRenderers component

  • Html(より簡単な方法) (今日Java up to Html3.2)を使用してセルをフォーマットできます

于 2013-01-27T12:00:33.987 に答える
0

はい 可能です。
EDITまず、必要に応じて目的の列をレンダリングするメソッドをオーバーライドする場所
のサブクラスを作成する必要があります。そして、その列のレンダラーを のサブクラスで変更します。 このタスクを達成するための例を次に示します。DefaultTableCellRenderergetTableCellRendererComponentDefaultTableCellRenderer

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
public class TableExample extends JFrame
{
    JTable myTable ;
    Object[][] data= {
                    {"34","[56],987,[(56)]"},
                    {"5098","345,([{78}])"},
                    {"567","4312"}
                };
    Object[] col = {"First","Second"};
    public TableExample()
    {
        super("CellRendererExample");
    }
    public void prepareAndShowGUI()
    {
        myTable = new JTable(data,col);
        myTable.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());
        JScrollPane jsp = new JScrollPane(myTable);
        getContentPane().add(jsp);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    public class MyTableCellRenderer extends DefaultTableCellRenderer 
    {
        public Component getTableCellRendererComponent(JTable table,Object oValue, boolean isSelected, boolean hasFocus, int row, int column) 
        {
            Component c = super.getTableCellRendererComponent(table, oValue,isSelected, hasFocus,row, column);
            String value = (String)oValue;
            StringBuilder sBuilder = new StringBuilder();
            sBuilder.append("<HTML><BODY>");
            StringTokenizer tokenizer = new StringTokenizer(value,",");
            while (tokenizer.hasMoreTokens())
            {
                String token = tokenizer.nextToken();
                int index = token.indexOf("[");
                if (index != -1)
                {
                    sBuilder.append(token.substring(0,index));
                    int lastIndex = token.lastIndexOf(']');
                    String subValue = token.substring(index + 1,lastIndex);
                    sBuilder.append("[<FONT color = red>"+subValue+"</FONT>]");
                    if (lastIndex < token.length() -1)
                    {
                        sBuilder.append(token.substring(lastIndex+1,token.length()));
                    }
                    sBuilder.append(",");
                }
                else
                {
                    sBuilder.append(token+",");
                }
            }
            if (sBuilder.lastIndexOf(",") == sBuilder.length() - 1)
            {
                sBuilder.deleteCharAt(sBuilder.length() - 1 );
            }
            sBuilder.append("</BODY></HTML>");
            value = sBuilder.toString(); ;
            JLabel label =(JLabel)c;
            label.setText(value);
            return label;
        }
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                TableExample tae = new TableExample();
                tae.prepareAndShowGUI();
            }
        });
    }

}
于 2013-01-27T11:57:36.053 に答える