Пытаюсь создать JTable с правильным заголовком строки

Я пытаюсь создать JTable с заголовком строки, который выглядит так же, как заголовок столбца, и я потратил в целом слишком много времени на это: / Моя ситуация похожа на этот вопрос: Реализация заголовка строки JTable и, возможно, этот: настройка jtable cellrenderer с цветом заголовка ячейки таблицы

Кажется, они еще не дошли до меня. Я пробовал много примеров, и все они отсутствуют.Нет даже примеров таблиц с заголовками строк от Oracle / Sun. Кажется, такой стол не должен быть такой уж редкостью.

Это просто форматирует первый столбец, но он не совсем выглядит или действует как заголовок столбца: http://java-swing-tips.blogspot.com/2011/01/ jtable-rowheader.html

Кажется, здесь используется JList для заголовка строки, есть проблемы с выравниванием (отклонение на +1 пиксель в каждой строке), и он не выглядит лучше, когда я устанавливаю Look and Feel. {{1 }} http://www.java2s.com/Code/Java/Swing-Components/TableRowHeaderExample.htm

Это похоже на идею, которую мне нужно было использовать (заголовок строки представляет собой отдельную JTable, но затем загружается в JScrollPane в качестве заголовка строки), но мне нужно адаптировать его к моему коду, а затем убедиться, что заголовок строки имеет правильный вид и ощущение заголовка.
http://www.chka.de/swing/table/row-headers/JTable.html

Это то, что я сделал за вычетом последнего бита. Я пытаюсь сделать так, чтобы средство визуализации заголовка таблицы было средством визуализации и для заголовка строки. Заголовок строки / первый столбец теперь серый, а не белый, как тогда, когда это был просто еще один столбец данных, но по-прежнему не похож на заголовок столбца. Это правильно? Или мне следует оставить его как обычный столбец в основной таблице и сделать с ним что-нибудь еще?

Итак, вот мой код для обновления таблицы. Этот метод просто принимает массив String для заголовка столбца, массив String для заголовка строки и массив 2D String для основных данных. У меня есть JTable dispTableRowHeader для заголовка строки и JTable dispTable для основной таблицы данных.

    private void updateDispTable(String[][] graphicalTable, String[] graphicalTableColumnHeader, String[] graphicalTableRowHeader) {

    //set model for the main data table, put in data. Also prevent editing cells
    dispTable.setModel(new javax.swing.table.DefaultTableModel(
        graphicalTable,
        graphicalTableColumnHeader
    ){
        @Override
        public boolean isCellEditable(int rowIndex, int mColIndex) {
            return false;
        }
    });

    //some mods for main data table
    dispTable.getTableHeader().setReorderingAllowed(false);//Was also able to do this within NetBeans GUI Builder by doing Table Contents from Jtable inspector item
    dispTable.getTableHeader().setResizingAllowed(false);

    //load main table to scrollpane
    jScrollPane2.setViewportView(dispTable);

    //get model for JTable that will be used as the row header, fill in values
    DefaultTableModel rowHeaderTableModel = new DefaultTableModel(0, 1);//one column
    for (int i = 0; i < graphicalTable.length; i++)
        rowHeaderTableModel.addRow(new Object[] { graphicalTableRowHeader[i] } );

    //set model for row header, put in data. Alter renderer to make it like col header
    dispTableRowHeader.setModel(rowHeaderTableModel);
    dispTableRowHeader.setDefaultRenderer(Object.class, dispTableRowHeader.getTableHeader().getDefaultRenderer());//makes it gray but not like the header :/
    //dispTableRowHeader.setDefaultRenderer(Object.class, jScrollPane2.getColumnHeader().getDefaultRenderer());

    //load row header to scrollpane's row header
    jScrollPane2.setRowHeaderView(dispTableRowHeader);

    //set the table corner and disallow reordering and resizing
    JTableHeader corner = dispTableRowHeader.getTableHeader();
    corner.setReorderingAllowed(false);
    corner.setResizingAllowed(false);
    jScrollPane2.setCorner(JScrollPane.UPPER_LEFT_CORNER, corner);//load to scrollpane
}

Я очень признателен за любую помощь!

РЕДАКТИРОВАТЬ НИЖЕ ИЗМЕНИТЬ НИЖЕ Я создал совершенно новый проект для экспериментов и попробовал метод trashgod (хотя делал это для заголовка строки, а не для второй строки) и обнаружил, что он дал мне то же самое результат только ячеек, оформленных в сером цвете, а не в стиле заголовка. Затем я попытался удалить настройку Look and Feel

        // Set System L&F
        UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

, и тогда заголовок строки выглядел так же, как заголовок столбца! .. но это в Nimbus или в другом стиле Look and Feel по умолчанию. См. Изображения ниже. Первый - это мой внешний вид, установленный на систему, как указано выше (в Win7), а второй - по умолчанию.

Внешний вид системы (Win7) - I adjusted look and feel, set to system look and feel

Внешний вид Nimbus в Java - default look and feel

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

Между прочим, вот пример MySQL Workbench в Win7, который имеет правильно оформленные заголовки строк и столбцов, и оба они даже окрашивают ячейки в голубоватый оттенок при наведении курсора мыши. Жаль, что это не сделано на Java, поэтому я мог бы попытаться проверить, как они это сделали.

Снимок экрана MySQL Workbench - MySQL Workbench screenshot

ИЗМЕНИТЬ НИЖЕ ИЗМЕНИТЬ НИЖЕ Код SSCCE

package mytableexample2;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class MyTableExample2 extends javax.swing.JFrame {

    public MyTableExample2() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable(){
            @Override
            public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int col) {
                if (col == 0) {
                    return this.getTableHeader().getDefaultRenderer()
                        .getTableCellRendererComponent(this,
                        this.getValueAt(row, col), false, false, row, col);
                } else {
                    return super.prepareRenderer(renderer, row, col);
                }
            }
        };
        jTable1.setAutoCreateRowSorter(false);
        final JTableHeader header = jTable1.getTableHeader();
        header.setDefaultRenderer(new HeaderRenderer(jTable1));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"Row 1", "Data 2", "Data 3", "Data 4", "Data 5"},
                {"Row 2", "Data 6", "Data 7", "Data 8", "Data 9"},
                {"Row 3", "Data 10", "Data 11", "Data 12", "Data 13"}
            },
            new String [] {
                "", "Col 1", "Col 2", "Col 3", "Col 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);


        //Netbeans generated layout
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE)
                .addContainerGap())
        );
        pack();
    }


    public static void main(String args[]) {
        try {
            //THIS SETS TO SYSTEM'S LOOK AND FEEL
            UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

            //THIS SETS TO OTHER JAVA LOOK AND FEEL
            //UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
            //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

        } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(MyTableExample2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(MyTableExample2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(MyTableExample2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(MyTableExample2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyTableExample2().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
}

class HeaderRenderer implements TableCellRenderer {
TableCellRenderer renderer;
    public HeaderRenderer(JTable jTable1) {
        renderer = jTable1.getTableHeader().getDefaultRenderer();
    }
    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int col) {
        return renderer.getTableCellRendererComponent(
            table, value, isSelected, hasFocus, row, col);
    }
}

12
задан Community 23 May 2017 в 12:10
поделиться