2

値の配列から入力されるJtableがあります。私のコードは次のようなものです:

  private static final String[] columnNames = {"Line Number", "Error","Fix Proposed","Percentage (%)"};
  static DefaultTableModel model = new DefaultTableModel(null,columnNames);

  public static void DisplayMyJList(List<CaptureErrors> x,String extension,
        ArrayList<Integer> l,ArrayList<Integer> p,
        ArrayList<String> e,ArrayList<String> s) throws IOException {//Method to Dynamic get values to be populated in Jtable.

    String theExtension = extension;
    if(FILE_EXTENSION.equals("java")) {
        for(CaptureErrors ex: x) {

            Vector row = new Vector();
            row.add(ex.getLinenumber());
            row.add(ex.getMyfounderror());
            row.add(ex.getMycorrection());
            row.add(ex.getMyPercentage()+"%");

            model.addRow( row );

            //model.setRowColour(1, Color.YELLOW);
        }
    }

table = new JTable(model);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);    
    table.setFillsViewportHeight(true);
    table.setShowGrid(true);
    table.setShowVerticalLines(true);
    table.setGridColor(new Color(0,128,0));
    JTableHeader header = table.getTableHeader();
    table.setBackground(new Color(255,228,225));
    table.setEnabled(true);
    header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12));
    header.setBackground(Color.black);
    header.setForeground(Color.yellow);
    JScrollPane pane4 = new JScrollPane(table); 

JButtonを使用して、値の配列からJtableにデータを入力できます。列"percentage"の場合、この列のすべての値が30を超えると、行がcolor.redに強調表示されるという条件が必要です。

TableCellRendererComponentを使用したくない。Jbuttonをクリックしたときにこのアクションを実行したい。

実際のJtableは次のようになります。 ここに画像の説明を入力してください

次に、取得したい内容に応じて、最初の2行が赤で強調表示されます。助けていただければ幸いです。

4

3 に答える 3

7

カスタムレンダラーを作成しないソリューションについては、テーブル行レンダリングのアプローチを参照してください。

パーセンテージ列を簡単にフォーマットできるように、テーブルフォーマットレンダラーを確認することもできます。

于 2013-03-25T04:57:08.810 に答える
5

レンダリングAPIの問題の1つは、複合レンダラーを提供することが難しいことです。方法はいくつかありますが、誤解しないでください。ただし、組み込みがあれば良かったと思います... [end rant] ...

基本的な考え方は、必要な条件下で何をすべきかを決定するために必要なロジックを含むベースレンダラーから拡張する一連のレンダラーをセットアップすることです。

public class FilterRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        Double percent = (Double) table.getValueAt(row, 3);
        // You'll need some way to supply the filter value, may via a centralised 
        // manager of some kind.
        if (percent > 0.3 && !isSelected) {
            setOpaque(true);
            setBackground(Color.RED);
        } else {
            setOpaque(false);
        }
        return this;
    }
}

public class OtherCellRenderer extends FilterRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
        // Apply any special renderer requirements, like translating an object value to String
        return this;
    }
}

列ごとにカスタムレンダラーが必要になり(例では4)、それぞれをテーブル列に適用します

TableColumnModel model = table.getColumnModel();
model.getColumn(0).setCellRenderer(new LineNumberRenderer());
model.getColumn(1).setCellRenderer(new ErrorRenederer());
model.getColumn(2).setCellRenderer(new FixProposedRenderer());
model.getColumn(3).setCellRenderer(new Percentage());

JXTableまたは、行蛍光ペンのサポートが組み込まれているSwingLabsを使用することもできます

于 2013-03-25T04:58:54.030 に答える
4

カスタムセルレンダラーを作成できます。その実装では、特定の行のパーセンテージ値が30より大きいかどうかを確認してから、このセルを強調表示します。

例えば:

class SomeRenderer 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 (isHighlightingEnabled){
            Integer percentage = (Integer) table.getValueAt(row, 3);
            if (percentage > 30)
                c.setBackground(Color.RED);
        }
        return c;
    }
}

必要に応じて、アクション時にこのレンダリングロジックを有効/無効にすることができます。

詳細については、カスタムレンダラーの使用を参照してください。

于 2013-03-25T04:57:18.013 に答える