о ширине столбца JTable в JScrollPane - PullRequest
3 голосов
/ 10 августа 2010

Я хочу установить каждый столбец JTable в JScrollPane с фиксированной шириной num, но я не могу сделать это с infoTable.getColumnModel().getColumn(0).setPreferredWidth(10); Я использую макет JScrollPane по умолчанию и добавляю таблицу с setViewPortView (infoTable) scrollPane в j2se 1.4. Как я могу это сделать? вот мой код

private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
public TableFrame() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(
        new java.awt.Color(0, 0, 0)));

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    this.setSize(new Dimension(600, 600));
    this.jScrollPane1.setSize(500, 500);
    this.getContentPane().add(this.jScrollPane1, BorderLayout.CENTER);
    this.getContentPane().add(this.jButton1, BorderLayout.WEST);
    table = new JTable(new javax.swing.table.DefaultTableModel(100, 2));
    this.jScrollPane1.setViewportView(table);
    table.getColumnModel().getColumn(0).setWidth(10);
}

пс. Спасибо за ответ Мне нужно, столбец можно перетащить, чтобы изменить размер, поэтому я не могу установить максимальный и минимальный размер

Ответы [ 5 ]

8 голосов
/ 10 августа 2010

Также установите минимальную и максимальную ширину столбца так же, как установлено с setPreferredWidth.

infoTable.getColumnModel().getColumn(0).setMinWidth(10);
infoTable.getColumnModel().getColumn(0).setMaxWidth(10);
infoTable.getColumnModel().getColumn(0).setPreferredWidth(10);
5 голосов
/ 10 августа 2010

В общем, вам нужно только установить предпочтительную ширину. Но для достижения вашей цели вам сначала нужно знать ширину по умолчанию и то, как они используются для определения фактического размера по умолчанию:

min = 15  
preferred = 75  
max = Integer.MAX_VALUE

Так что вы не можете использовать 10, если вы также не измените минимальную ширину.

Давайте рассмотрим простой случай, когда предпочитаемая ширина равна 25 для столбца 1, а полоса прокрутки - 500. Поэтому предпочтительная ширина двух столбцов - 100 (25 + 75). Дополнительные 400 пикселей распределяются равномерно между двумя столбцами, поэтому столбцы будут отображаться с 225 (25 + 200) и 275 (75 + 200). Поэтому по умолчанию вы не можете просто отобразить первый столбец с разрешением 25 пикселей, если только для второго столбца не установлено значение 475.

Если вы хотите, чтобы все столбцы отображались с предпочтительной шириной, вам необходимо использовать:

table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
1 голос
/ 10 августа 2010

Обратите внимание, что setWidth() "не следует использовать для установки ширины столбцов в JTable, вместо этого используйте setPreferredWidth()."Кроме того, избегайте множества противоречивых ограничений.Слишком много нарушит ваши намерения.Часто достаточно одного setPreferredSize(), как предлагается ниже.

Обратите внимание, что некоторые функции изменены для выделения.

http://i38.tinypic.com/7281tt.png http://i38.tinypic.com/7281tt.png

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

/** @see http://stackoverflow.com/questions/3448030 */
public class TablePanel extends JPanel {

    private JButton button = new JButton("Button");
    private JTable table = new JTable(new DefaultTableModel(100, 2));
    private javax.swing.JScrollPane jsp = new JScrollPane(table);

    public TablePanel() {
        super(new BorderLayout());
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e);
            }
        });
        JPanel panel = new JPanel();
        panel.add(button);
        this.add(panel, BorderLayout.WEST);

        jsp.setBorder(BorderFactory.createLineBorder(Color.red));
        jsp.getViewport().setPreferredSize(new Dimension(500, 500));
        this.add(jsp, BorderLayout.CENTER);
        table.getColumnModel().getColumn(0).setPreferredWidth(6);
        table.setGridColor(Color.gray);
    }

    private void display() {
        JFrame f = new JFrame("TablePanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

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

            @Override
            public void run() {
                new TablePanel().display();
            }
        });
    }
}
0 голосов
/ 20 ноября 2014

Как сказали другие участники, вы должны установить предпочтительную, минимальную и максимальную ширину.Здесь вы можете найти пример, в котором столбец 0 растет, а столбец 1 имеет фиксированную ширину:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
final int COLUMN_0_WIDTH = 650;
final int COLUMN_1_WIDTH = 200;
table.getColumnModel().getColumn(0).setPreferredWidth(COLUMN_0_WIDTH);
table.getColumnModel().getColumn(0).setMinWidth(COLUMN_0_WIDTH);
table.getColumnModel().getColumn(0).setMaxWidth(COLUMN_0_WIDTH*3);

table.getColumnModel().getColumn(1).setPreferredWidth(COLUMN_1_WIDTH);
table.getColumnModel().getColumn(1).setMinWidth(COLUMN_1_WIDTH);
table.getColumnModel().getColumn(1).setMaxWidth(COLUMN_1_WIDTH);
0 голосов
/ 10 августа 2010

Использование:

setWidth(int i) 

в сочетании с:

setMaxWidth(int i)
setMinWidth(int i)

Используйте это только в том случае, если вы хотите установить фиксированную ширину столбца и хотите, чтобы он оставался такимесли таблица меняет размер или местоположение.

setPreferredWidth(10) - это только рекомендация для менеджера макета.

...