изменить размер первого столбца таблицы, т.е. номера, отображающего столбец в java

#java #swing #jtable #jscrollpane

#java #swing #jtable #jscrollpane

Вопрос:

Я включаю пример кода моего приложения

1-й класс

 import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import org.jdesktop.swingx.JXTable;
import javax.swing.table.TableColumn;

public class setcolwidth {

    public static void main(String args[]) {

        final Object rowData[][] = {
            {"kirti", "one", "I"},
            {"kkk", "two", "II"},
            {"kiki", "three", "III"}};
        final String columnNames[] = {"#", "English", "Roman"};

        final JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);

        JXTable lineTable = new LineNumberTable(table);
        scrollPane.setRowHeaderView(lineTable);
        table.getTableHeader().setReorderingAllowed(false);
        JFrame frame = new JFrame("Resizing Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(scrollPane, BorderLayout.CENTER);


        TableColumn column = null;
        int i=0;
        try{

            column = lineTable.getColumnModel().getColumn(i);

                column.setPreferredWidth(50);

        }catch(Exception ex){
            System.out.println("Error for the column index" i " Err" ex.toString());
        }

        frame.setSize(300, 150);
        frame.setVisible(true);

    }
    }
  

и 2-й класс

 import javax.swing.JTable;
import javax.swing.table.*;
import org.jdesktop.swingx.JXTable;

public class LineNumberTable extends JXTable {
    private JTable mainTable;

    public LineNumberTable(JTable table) {
        super();
        mainTable = table;
        setAutoCreateColumnsFromModel( false );
        setModel( mainTable.getModel() );
        setAutoscrolls( false );
        addColumn( new TableColumn() );
        getColumnModel().getColumn(0).setCellRenderer(mainTable.getTableHeader().getDefaultRenderer());
      //  mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        getColumnModel().getColumn(0).setPreferredWidth(40);
        setPreferredScrollableViewportSize(getPreferredSize());

    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    @Override
    public Object getValueAt(int row, int column) {
         return Integer.valueOf(row 1);
    }

    @Override
    public int getRowHeight(int row) {
        return mainTable.getRowHeight();
    }
}
  

Но размер столбца с номером строки не изменяется.

Ответ №1:

Это потому, что вы устанавливаете предпочтительный размер столбца, и вместо этого вам нужно установить его в JViewport заголовке строки.

После этой строки:

     scrollPane.setRowHeaderView(lineTable);
  

Попробуйте это:

     scrollPane.getRowHeader().setPreferredSize(new Dimension(150,150));
  

Комментарии:

1. Вы не должны вручную устанавливать предпочтительный размер заголовка строки. Это может привести к проблемам с прокруткой. По крайней мере, я видел проблемы, когда люди пытались установить предпочтительный размер заголовка столбца. Выбор предпочтительной ширины столбца и предпочтительного размера окна просмотра с возможностью прокрутки должен быть правильным решением.

Ответ №2:

Я не использую JXTable, поэтому не могу ввести текст вашего кода. Но ваша базовая логика, на мой взгляд, подходит для JTable.

Взгляните на мою таблицу номеров строк, которая работает для меня. Возможно, разница в том, как я создаю TableColumn и присваиваю значение заголовка.

Комментарии:

1. я также пробую таблицу номеров строк, но я хочу изменить размер строки без компонента nsharma.s3.amazonaws.com / … это изображение отображает таблицу, в которой я хочу изменить размер столбца, содержащего список номеров.

2. @user609621, когда я использую JTable и RowNumberTable, я не вижу пробелов, найденных в вашем изображении. Создайте SSCCE ( sscce.org ) используя JTable и RowNumberTable, которые демонстрируют проблему. Тогда, возможно, мы сможем определить, заключается ли проблема в вашем коде или в том, как работает JXTable.