3

JTable最初の 2 つの列に文字列が含まれ、残りの列にアイコン (具体的には、クラスのオブジェクト) が含まれる を作成していますImageIcon。どちらの方法も知っていますが、1 つのテーブルに両方を混在させて、一部の列が文字列を返し、他の列がアイコンを返すようにするにはどうすればよいですか?

--EDIT--
コードの説明: データは 2D 文字列配列です。最初の 2 列については、表にそのまま表示したいと考えています。残りのすべての列では、可能な値は「Y」または「N」の 2 つだけです。「Y」がある場合は ImageIcon を表示し、「N」がある場合は空白のままにします。

(知っておくと役立つ場合は、値が「Y」の場合は目盛りアイコンを表示する比較表を描画しています。それ以外の場合は、値が「N」の場合はセルを空のままにしておきます)

現在、出力は次のようになります:
PATH_TO_ICON の値 ("//home//....") の場合は "Y"
"javax.swing.ImageIcon@288e509b" の場合は "N"

class MyTableModel extends AbstractTableModel {

    private Object[][] data;
    private String[] headers;

    public MyTableModel(String[][] data, String[] headers) {
        super();
        this.data = data;
        this.headers = headers;
    }

    @Override
    public int getColumnCount() {
        return headers.length;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        if (col < 2) {
            return data[row][col];
        } else {
            if (data[row][col].equals("Y")) {
                return new ImageIcon(PATH_TO_ICON);
            } else if(data[row][col].equals("N")) {
                return new ImageIcon();
                            } else return null;
        }
    }

    @Override
    public Class<?> getColumnClass(int col) {
        if (col < 2) {
            return String.class;
        } else {
            return ImageIcon.class;
        }
    }
}
4

3 に答える 3

4

必要に応じて (各列の) 列クラスを設定します。@mKorbel で言及されているように、テーブルの使用方法 - 概念: エディターとレンダラーも参照してください。

于 2012-05-07T12:39:14.753 に答える
4

JTableはIcon / ImageIcon.Classを認識しているため、追加の作業は必要ありません

于 2012-05-07T12:41:48.760 に答える
1

これは正しいコードです。

import java.awt.Dimension;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class MainTest extends JFrame {
private static final long serialVersionUID = 1L;


public static void main(String[] args) {
    MainTest mt = new MainTest();
    mt.doThis();
}

public void doThis(){
    String PATH_TO_ICON = "//home//icon.png";
    String[] headers = { "A", "B", "File1", "File2" };
    String[][] data = { { "1", "abc", "Y", "N" }, { "2", "def", "Y", "Y" } };
    JScrollPane scrollpane = new JScrollPane();
    JTable table = new JTable();
    table.setModel(new MyTableModel(data, headers, PATH_TO_ICON));
    scrollpane.setViewportView(table);

    // layout
    this.add(scrollpane);
    this.setLocationRelativeTo(null);
    this.setMinimumSize(new Dimension(400,300));
    this.setPreferredSize(new Dimension(600,400));
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setVisible(true);
}
}

class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private Object[][] data;
private String[] headers;
private String PATH_TO_ICON;

public MyTableModel(String[][] data, String[] headers, String PATH_TO_ICON) {
    super();
    this.data = data;
    this.headers = headers;
    this.PATH_TO_ICON = PATH_TO_ICON;
}

@Override
public int getColumnCount() {
    return headers.length;
}

@Override
public int getRowCount() {
    return data.length;
}

@Override
public Object getValueAt(int row, int col) {
    if (col < 2) {
        return data[row][col];
    } else {
        if (data[row][col].equals("Y")) {
            return new ImageIcon(PATH_TO_ICON);
        } else if (data[row][col].equals("N")) {
            return new ImageIcon();
        } else
            return null;
    }
}

@Override
public Class<?> getColumnClass(int col) {
    if (col < 2) {
        return String.class;
    } else {
        return ImageIcon.class;
    }
}

}

于 2012-05-14T13:08:25.290 に答える