调整 JTable 大小

Resize JTable size

我有一个 JTable,用户数据分布在 rowscolumns 中。我想什么时候,我在JTextFieldresize the sizeheightwith same width) 取决于找到的 rows 的数量。 为什么 table 的宽度变小了?

代码:

    tabla_clientes.setPreferredScrollableViewportSize(
            new Dimension(tabla_clientes.getPreferredSize().width, tabla_clientes.getRowHeight()*20)
    );

    //...

private void resizer() {
    revalidate();
    int w = jScrollPane.getPreferredSize().width; //width scroll pane
    int h1 = jScrollPane.getViewport().getViewSize().height; //height viewport
    int h2 = tabla_clientes.getPreferredScrollableViewportSize().height; //table height

    if(h1<h2)
      jScrollPane.setSize(new Dimension(w,h1));
    else
      jScrollPane.setSize(tabla_clientes.getPreferredScrollableViewportSize());
}

public void filtrar_dni() {
    int columna = 0;
    TRSFiltro.setRowFilter(RowFilter.regexFilter(textfield_buscar.getText(), columna));
}


private void textfield_buscarKeyTyped(java.awt.event.KeyEvent evt) {                                          
    textfield_buscar.addKeyListener(new KeyAdapter(){
    public void keyReleased(final KeyEvent e){
        String texto = (textfield_buscar.getText());
        textfield_buscar.setText(texto);
        filtrar_dni();
        resizer();
    }
    });
    
    TRSFiltro = new TableRowSorter<DefaultTableModel>((DefaultTableModel) tabla_clientes.getModel());
    tabla_clientes.setRowSorter(TRSFiltro);
}

意外结果:

原文table:

您应该使用布局管理器:https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 这使得组件的定位更加容易。一个易于理解的示例可能是:

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

public class Test {

    public static void main(String[] args) {
        JLabel bigLabel = new JLabel("VERY BIG");
        bigLabel.setPreferredSize(new Dimension(100, 1000));

        JPanel north = new JPanel();
        north.setLayout(new FlowLayout());
        north.add(new JLabel("NORTH CONTENT"));

        JScrollPane p = new JScrollPane();
        p.setViewportView(bigLabel);

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setPreferredSize(new Dimension(200, 300));
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(north, BorderLayout.NORTH);
        f.getContentPane().add(p, BorderLayout.CENTER);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

我不会向您展示没有布局管理器的版本,因为 1) 我什至不确定是否能够正确编写它,以及 2) 无论如何您都不应该这样做,除非您有非常 很好的理由(例如,没有满足您需要的布局管理器 - 顺便说一句,非常罕见)。