java - 让 JTextField 自动调整大小

标签 java swing jtextfield

我想显示一个由用户编辑的 JTextField 的二维数组。初始化后(带有文本),它们会以良好的尺寸显示。当文本被编辑时,它们不会调整大小。 我将它们放在 JPanel 中,并在 JrolePane 中使用 GridbagLayout。 尝试“手动”调整它们的大小,因此在接收事件时调用 .setPreferedSize,但很难获得 TextLength 准确的原因,因为 letterSize 不同。所有 JTextFields 都显示在一行中,所以我可能对 GridBagConstraints 有一些错误。 (以前用过JTable,但不喜欢)。

GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.weighty = 0.1;
    c.weightx = 0.1;
    c.fill = GridBagConstraints.BOTH;
    for(int row=0; row<initText.length; row++) {
        for(int col=0; col<initText[row].length; col++) {
            jTextFields[row][col] = new JTextField(initText[row][col]);
            jTextFields[row][col].getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void removeUpdate(DocumentEvent arg0) {
                }
                @Override
                public void insertUpdate(DocumentEvent dE) {
                    int row = -1;
                    int col = -1;
                    for(int i=0; i<jTextFields.length; i++) {
                        for(int ii=0; ii<jTextFields[i].length; ii++) {
                            if(jTextFields[i][ii].getDocument()==dE.getDocument()) {
                                row=i;
                                col=ii;
                                break;
                            }
                        }
                        if(col!=-1) {
                            break;
                        }
                    }
                    //Tried it so to make resize "by Hand" but initalisation size is better
                    jTextFields[row][col].setPreferredSize(new Dimension(jTextFields[row][col].getText().length()*jTextFields[row][col].getPreferredSize().height, jTextFields[row][col].getPreferredSize().height));
                    System.out.println("insertUpdate in cell "+row+" "+col);
                    Main.gui.frame.repaint();
                }
                @Override
                public void changedUpdate(DocumentEvent arg0) {
                    // TODO Auto-generated method stub
                }
            });
            c.gridx = col;
            c.gridy = row;
            innerContentPane.add(jTextFields[row][col], c);
        }
    }
    contentPane = new JScrollPane(innerContentPane);
    frame.repaint();

最佳答案

您不想不断重置组件的首选大小。让每个组件确定自己的首选大小。

相反,您希望调用布局管理器,以便可以重新计算每个组件的大小并调整面板的布局。执行此操作的一个简单方法是 revalidate() 包含文本字段的面板。

我不太喜欢多层循环代码。您可以通过创建一个由所有文档共享的通用 DocumentListener 来简化代码。

此外,您的代码仅处理添加文本的情况。如果删除文本怎么办,文本字段的大小不应该缩小吗?

应用上述所有建议,逻辑将类似于:

//  Create shared DocumentListener

DocumentListener dl = new DocumentListener()
{
    @Override
    public void removeUpdate(DocumentEvent de)
    {
        resizeTextField(de);
    }

    @Override
    public void insertUpdate(DocumentEvent de)
    {
        resizeTextField(de);
    }

    @Override
    public void changedUpdate(DocumentEvent de) {}

    private void resizeTextField(DocumentEvent de)
    {
        innerContentPane.revalidate();
    }
};

GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
//c.weighty = 0.1;
//c.weightx = 0.1;
//c.fill = GridBagConstraints.BOTH;

//  Create text fields and add listener to the Document

for(int row = 0; row < 3; row++)
{
    for(int col = 0; col <3; col++)
    {
            JTextField textField = new JTextField("0");
            textFields[row][col] = textField;
            textField.getDocument().addDocumentListener(dl);
            c.gridx = col;
            c.gridy = row;
            innerContentPane.add(textField, c);
    }
}

请注意,DocumentListener 还应该创建为内部类,以使代码更加简洁。

And all JTextFields show up in one line, so I probably get something wrong about GridBagConstraints

JPanel 的默认布局管理器是 FlowLayout。如果您想使用 GridBagLayout,则需要将布局设置为 GridBagLayout:

innerContentPane.setLayout( new GridBagLayout() );
GridBagConstraints c = new GridBagConstraints();

否则 GridBagConstraints 对 FlowLayout 没有任何意义。

阅读 Swing 教程中关于 Layout Manager 的部分了解更多信息。

关于java - 让 JTextField 自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55549406/

相关文章:

java - 从 Hibernate hbm 到 JPA 注释,一个具有挑战性的任务

java - 如何在正确(实时)的时间内传递可观察的元素?

java - java中的条形码生成

java - 每个带有问号光标的组件的上下文帮助

java - 即使选择了 JTextField,箭头键 KeyBindings 仍然有效

java - 自定义 LineMapper 在 Spring Batch 多文件处理中抛出异常

java - 使用 SOAP 复制 REST API

Java - Swing - .this 在 JOptionPane 中的含义

java - 限制文本字段输入

java:JTextField 上的完全控制输入