1

私は JTable をいじっていて、行名として AP の文字、列名として 1 から 24 の数字を持つテーブルを作成したいと考えています (それらがどのようなデータ型であるかは関係ありません)。これらの行と列の名前がテーブル内にあるか、外部軸としてあるかは問題ではありません (どちらか簡単なもの)。

私の現在の試みはString[]、行と列の名前に aString[][]を付け、実際の内容を a に付けることです。しかし、これを JTable を作成するための有効な形式にマージする方法がわかりません。私の現在のコード(動作しない)は次のとおりです。

    // Create table
    String[] columnNames = {"", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
                              "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"
                             };

    String[] rowNames = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"};

    String[][] compoundNames = new String[25][16];

    Object[][] plateData = {rowNames, compoundNames};

    table = new JTable(plateData, columnNames);
    table.setBorder(new LineBorder(new Color(0, 0, 0)));
    table.setBounds(10, 11, 564, 440);
    contentPane.add(table);

提案された解決策は、この概念に従う必要はありません。言ったように、私が必要なものを作るための最も簡単な方法は大歓迎です.

4

2 に答える 2

1

アルファベット値には行ヘッダーを使用する必要があります。行ヘッダーを使用する例を次に示します。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableRowHeader extends JList implements TableModelListener
{
    private JTable table;

    @SuppressWarnings("unchecked")
    public TableRowHeader(JTable table)
    {
        this.table = table;

        setAutoscrolls( false );
        setCellRenderer(new RowHeaderRenderer());
        setFixedCellHeight(table.getRowHeight());
        setFixedCellWidth(50);
        setFocusable( false );
        setModel( new TableListModel() );
        setOpaque( false );
        setSelectionModel( table.getSelectionModel() );
        table.getModel().addTableModelListener( this );
    }

    public void tableChanged(TableModelEvent e)
    {
        if (e.getType() == TableModelEvent.INSERT
        ||  e.getType() == TableModelEvent.DELETE)
        {
            repaint();
        }
    }

    /*
     *  Use the table to implement the ListModel
     */
    class TableListModel extends AbstractListModel
    {
        public int getSize()
        {
            return table.getRowCount();
        }

        public Object getElementAt(int index)
        {
            return String.valueOf(index + 1);
        }
    }

    /*
     *  Use the table row header properties to render each cell
     */
    class RowHeaderRenderer extends DefaultListCellRenderer
    {
        RowHeaderRenderer()
        {
            setHorizontalAlignment(CENTER);
            setOpaque(true);
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            setFont(table.getTableHeader().getFont());
            setBackground(table.getTableHeader().getBackground());
            setForeground(table.getTableHeader().getForeground());
        }

        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {

            if (isSelected)
            {
                setBackground( table.getSelectionBackground() );
            }
            else
            {
                setBackground( table.getTableHeader().getBackground() );
            }

            setText( (value == null) ? "" : value.toString() );

            return this;
        }
    }
    private static void createAndShowUI()
    {

        final JTable table = new JTable( 1000, 256 );
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        JScrollPane scrollPane = new JScrollPane( table );
        scrollPane.setRowHeaderView( new TableRowHeader( table) );

        JFrame frame = new JFrame("Row Header Test");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

あなたの場合、カスタム ListModel は必要ありません。値 AP を JList に追加するだけです。

于 2013-07-31T18:24:50.373 に答える