【问题标题】:Resize JTable size调整 JTable 大小
【发布时间】:2021-05-19 10:58:21
【问题描述】:

我有一个JTable,用户数据分布在rowscolumns。我想要什么时候,我在 JTextField 中查找使用 ID 的用户,调整大小height宽度相同)取决于rows 找到。 为什么表格宽度变小了?

代码:

    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);
}

意外结果:

原表:

【问题讨论】:

  • 您似乎没有使用任何布局管理器。是故意的吗?因为通过使用布局,您将不再需要自己进行任何计算。查看布局:docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
  • @spi 我没有使用任何布局。有必要吗?
  • 不,这不是绝对必要的。但是如果你使用一个会容易得多。它实现了所有必要的计算,以使组件的大小适应可用空间。它将对框架的大小调整、组件的隐藏等做出反应。
  • @spi 如果不使用布局,可能的解决方案是什么?和布局?我希望能对这两个选项进行简要说明,以了解其中的区别。
  • 见下面的例子。

标签: java swing jtable


【解决方案1】:

您应该使用 LayoutManagers: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) 你不应该这样做,除非你有一个 非常很好的理由(例如,没有满足您需求的布局管理器 - 顺便说一句,非常罕见)。

【讨论】:

  • 我是 Swing 的初学者,所以在任何 JFrameJDialog 中使用布局是“强制性的”吗?那么......在我的代码中使用布局就足够了吗? setLayout(new BorderLayout());
  • 如前所述,自己管理会更难。所以,即使不是“强制性的”,你也会通过学习布局获得很多好处(这甚至不是很难理解,至少对于某些布局来说——GridBagLayout 是另一回事......)。我建议您查看我提供的链接,运行示例,使用它们并基本了解您的选择。开始的时间不应该超过几个小时。如有疑问,请回来询问,我会尽量准确回答。
  • 我理解你的解释并通过插入panel_medio.setLayout(new FlowLayout());得到它
  • @SrCantabri,您在上一个问题中获得了一个使用布局管理器的完整工作示例:stackoverflow.com/questions/67506793/…。您继续通过 1) 不发布 MRE 和 2) 不遵循可行的解决方案来浪费人们的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2011-03-21
  • 2016-09-17
相关资源
最近更新 更多