根据内容(行数)重置 JTable [英] Reset JTable depending on content (number of rows)

查看:44
本文介绍了根据内容(行数)重置 JTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 JPanel 中有一个 JTable,而 JPanel 又在 Jframe 中.JTable 从表(MySQL 中的数据库)加载用户.

I have a JTable inside a JPanel which in turn is in a Jframe. The JTable loads users from a table (database in MySQL).

我有一个使用 DNI 的搜索引擎,其中带有 KeyTyped 事件的键对键正在更新表中的联系人,并且只显示那些满足浏览器模式 (JTextField).如果只有 2-3-4 个客户,表格不会调整为客户大小,而是用灰色背景填充表格的其余部分.(见图).表格的下限如何重置?

I have a search engine using DNIs in which key-to-key, with a KeyTyped event, is updating the contacts in the table, and show only those that meet the browser pattern (JTextField). If there are only 2-3-4 clients, the table is not resized to the customer size, but fills the rest of the table with a gray background. (see image). How could the lower bound of the table be reset?

代码:

public class Listado_clientes1 extends javax.swing.JFrame{
    private TableRowSorter<DefaultTableModel> TRSFiltro;
    
    public Listado_clientes1() {
        this.getContentPane().setBackground(Color.orange);
        panel_top.setBackground(Color.orange);
        tabla_clientes.setPreferredScrollableViewportSize(
                new Dimension(tabla_clientes.getPreferredSize().width, tabla_clientes.getRowHeight()*20)
        );

        try {
            DefaultTableModel modelo = new DefaultTableModel();
            tabla_clientes.setModel(modelo);

            PreparedStatement ps = null;
            ResultSet rs = null;
            Connection con = Conexiones.conexion_a_BBDD("agenda");

            String sql = "SELECT dni, nombre, apellidos, telefono, direccion, ciudad, email FROM clientes";
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();

            ResultSetMetaData rsMd = (ResultSetMetaData) rs.getMetaData();
            int cantidadColumnas = rsMd.getColumnCount();

            modelo.addColumn("DNI");
            modelo.addColumn("NOMBRE");
            modelo.addColumn("APELLIDOS");
            modelo.addColumn("TLFONO");
            modelo.addColumn("DIRECCION");
            modelo.addColumn("CIUDAD");
            modelo.addColumn("EMAIL");
            
            while (rs.next()) {
                Object[] filas = new Object[cantidadColumnas];
                for (int i=0; i<cantidadColumnas; i++) {
                    filas[i] = rs.getObject(i+1);
                }
                modelo.addRow(filas);
            }
        } catch (SQLException ex) {
            System.err.println(ex.toString());
        }
    }

    /**
     * Filtrar: Buscar por DNI.
     */
    public void filtrar_dni() {
        int columna = 0; //Es la fila del DNI.
        TRSFiltro.setRowFilter(RowFilter.regexFilter(textfield_buscar.getText(), columna));
    }
    
    
    private void textfield_buscarKeyTyped(java.awt.event.KeyEvent evt) {                                          
        Character letra = evt.getKeyChar();
        evt.setKeyChar(Character.toUpperCase(letra));

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

大纲/方案:

推荐答案

任何时候表格视图中的行数发生变化都需要重新计算表格的首选可滚动视口大小.重新计算此大小后,您需要调用包含表格的面板的布局管理器:

Any time the number of rows in the view of the table changes you need to recalculate the preferred scrollable viewport size of the table. Once this size is recalculated you need to invoke the layout manager of the panel containing the table:

可重用的方法类似于:

public void resetTablePreferredScrollableViewportSize(JTable table, int maxRows)
{
    Dimension size = table.getPreferredSize();
    int displayRows = Math.min(table.getRowCount(), maxRows);
    size.height = displayRows * table.getRowHeight();

    table.setPreferredScrollableViewportSize( size );

    Container parent = SwingUtilities.getAncestorOfClass(JPanel.class, table);
    parent.revalidate();
    parent.repaint();
}

因此在设置行过滤器后,您可以使用:

So after setting the row filter you could use:

tabla_clientes.setRowSorter(TRSFiltro);
resetTablePreferredScrollableViewportSize(tabla_clientes, 10);

现在滚动窗格的大小应设置为最多显示 10 行,之后滚动窗格的滚动条将出现.

Now the scroll pane should be sized to display up to 10 rows after which the scrollbar of the scroll pane will appear.

我不知道如何给出一个可重现的例子

I don't know how to put a reproducible example

那你就不明白你的问题是什么.

Then you don't understand what your problem is.

您的问题是:

根据行数重置 JTable(大小)

所以数据不相关,只有行数相关.

So the data is irrelevant, only the number of rows is relevant.

测试这一点很容易,因为您可以创建具有指定行数的 DefaultTableModel.

It is easy to test this because you can create a DefaultTableModel with a specified number of rows.

下面是一个简单的 MRE.测试你:

Below is a simple MRE. To test you:

  1. 在文本字段中输入一个数字
  2. 按回车

表格将调整大小以显示指定的行数.如果数字大于 10,表格大小将被固定,并会出现一个滚动条:

The table will be resized to display the specified number of rows. If the number is greater that 10 the table size will be fixed and a scrollbar will appear:

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

public class SSCCE extends JPanel
{
    JTextField textField;
    JTable table;

    public SSCCE()
    {
        setBackground(Color.YELLOW);

        textField = new JTextField(5);
        add(textField);

        table = new JTable(new DefaultTableModel(0, 4));
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        add( new JScrollPane(table) );

        textField.addActionListener((e) ->
        {
            int rows = Integer.parseInt( textField.getText() );

            table.setModel( new DefaultTableModel(rows, 4) );
            resetTablePreferredScrollableViewportSize(table, 10);
        });
    }

    public void resetTablePreferredScrollableViewportSize(JTable table, int maxRows)
    {
        Dimension size = table.getPreferredSize();
        int displayRows = Math.min(table.getRowCount(), maxRows);
        size.height = displayRows * table.getRowHeight();

        table.setPreferredScrollableViewportSize( size );

        Container parent = SwingUtilities.getAncestorOfClass(JPanel.class, table);
        parent.revalidate();
        parent.repaint();
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//      frame.pack();
        frame.setSize(500, 250);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

这篇关于根据内容(行数)重置 JTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆