java让窗口可调大小_java – 使用可滚动的JTextField调整大小问题

本文介绍了Java Swing中遇到的一个问题:当在表单中使用可滚动的JTextField时,窗口调整大小会导致滚动条消失。通过分析代码,提出了解决方案,即正确设置GridBagConstraints的fill属性,避免使用setPreferredSize(),以确保组件在调整大小时保持正常尺寸。
摘要由CSDN通过智能技术生成

我有一个包含大量文本字段的表单,其中一些文本字段可能包含很长的字符串.为了使它工作,我使用以下代码使这些文本字段可滚动:

JScrollPane scroll = new JScrollPane(textField);

scroll.setPreferredSize(new Dimension((int)textField.getPreferredSize().getWidth(), (int)textField.getPreferredSize().getHeight() * 2));

然后我使用GridBagLayout将滚动放入我的表单.

我的示例中的第二行是滚动条显示所必需的.但它有缺点.当我调整窗口大小以适应文本字段中的整个文本时,滚动消失,只留下两倍高于其他文本字段,这看起来很荒谬.

在隐藏滚动条后,如何使这一切工作并显示正常大小的文本字段?

编辑:

您可以使用以下作为演示代码来重现该问题:

import javax.swing.*;

import java.awt.*;

public class ScrollTextDemo extends JFrame{

public ScrollTextDemo(){

super();

this.setPreferredSize(new Dimension(500, 300));

JPanel panel = new JPanel();

panel.setLayout(new GridBagLayout());

JTextField textField = new JTextField("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

textField.setCursor(new Cursor(0));

textField.setEditable(false);

JScrollPane scroll = new JScrollPane(textField);

scroll.setPreferredSize(new Dimension(70, 40) );

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridx = 1;

gbc.gridy = 1;

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.weightx = 0.5;

gbc.insets = new Insets(5, 5, 0, 5);

panel.add(scroll,gbc);

//let's add one more text field without scroll bar to compare

JTextField textField2 = new JTextField("abc");

gbc = new GridBagConstraints();

gbc.gridx = 1;

gbc.gridy = 2;

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.weightx = 0.5;

gbc.insets = new Insets(5, 5, 0, 5);

panel.add(textField2,gbc);

this.add(panel);

}

public static void main(String args[]){

ScrollTextDemo demo = new ScrollTextDemo();

demo.pack();

demo.setVisible(true);

}

}

解决方法:

为此,在没有良好的SSCCE的情况下,我认为你没有提供任何用于填充的约束

当组件的显示区域大于组件的请求大小时使用,以确定是否以及如何调整组件大小.有效值(定义为GridBagConstraints常量)包括NONE(默认值),HORIZONTAL(使组件足够宽以水平填充其显示区域,但不更改其高度),VERTICAL(使组件足够高以垂直填充其显示区域) ,但不要改变它的宽度)和BOTH(使组件完全填充其显示区域).

所以你必须在GridBagConstraints中添加这样的东西

constraintsGridBag.fill = GridBagConstraints.HORIZONTAL;

这只会让它不是两种方式扩展HORIZONTALLY.

**编辑:至于添加的代码**

永远不要为Swing中的任何组件指定setPreferredSize(…).让您使用布局管理器,注意这一点.删除所有setPreferredSize(…)的东西,在调整大小时让它保持正常大小.

*编辑2:*

代码告诉你我在说什么:

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;

import java.awt.GridLayout;

import java.awt.Insets;

import java.awt.event.*;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextField;

public class GridBagTest extends JFrame

{

private JPanel topPanel;

private JPanel bottomPanel;

public GridBagTest()

{

setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();

gbc.gridwidth = GridBagConstraints.REMAINDER;

//gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.fill = GridBagConstraints.BOTH;

gbc.weightx = 1.0;

gbc.weighty = 0.8;

// Setting TOP PANEL.

topPanel = new JPanel();

topPanel.setLayout(new GridBagLayout());

GridBagConstraints constraintsTopPanel = new GridBagConstraints();

constraintsTopPanel.gridwidth = 2; // Specifies that this component will take two columns.

constraintsTopPanel.gridheight = 1; // specifies that the component will take one row.

/*

* fill with HORIZONTAL, means the component upon resize, will

* only expand along the X-Axis.

*/

constraintsTopPanel.fill = GridBagConstraints.NONE;

constraintsTopPanel.insets = new Insets(5, 5, 5, 5);

constraintsTopPanel.ipadx = 2;

constraintsTopPanel.ipady = 2;

constraintsTopPanel.weightx = 0.3;

constraintsTopPanel.weighty = 0.2;

constraintsTopPanel.gridx = 0;

constraintsTopPanel.gridy = 0;

JTextField tfield1 = new JTextField("kajslkajfkl dsjlafj lksdj akljsd lfkajflkdj lkaj flkdjalk jflkaj lkfdsj salkj flkaj flkja dslkfjal ksjdflka jlfjd aflsdj", 10);

topPanel.add(tfield1, constraintsTopPanel);

constraintsTopPanel.gridx = 2;

constraintsTopPanel.gridy = 0;

final JTextField tfield2 = new JTextField("kajslkajfkl dsjlafj lksdj akljsd lfkajflkdj lkaj flkdjalk jflkaj lkfdsj salkj flkaj flkja dslkfjal ksjdflka jlfjd aflsdj", 10);

topPanel.add(tfield2, constraintsTopPanel);

constraintsTopPanel.gridx = 4;

constraintsTopPanel.gridy = 0;

JTextField tfield3 = new JTextField("kajslkajfkl dsjlafj lksdj akljsd lfkajflkdj lkaj flkdjalk jflkaj lkfdsj salkj flkaj flkja dslkfjal ksjdflka jlfjd aflsdj", 10);

topPanel.add(tfield3, constraintsTopPanel);

topPanel.setBackground(Color.WHITE);

add(topPanel, gbc);

constraintsTopPanel.gridx = 0;

constraintsTopPanel.gridy = 2;

constraintsTopPanel.gridwidth = 6; // Specifies that this component will take two columns.

constraintsTopPanel.gridheight = 1; // specifies that the component will take one row.

JButton button = new JButton("REMOVE");

button.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

topPanel.remove(tfield2);

topPanel.revalidate();

topPanel.repaint();

}

});

topPanel.add(button, constraintsTopPanel);

//Setting BOTTOM PANEL.

bottomPanel = new JPanel();

bottomPanel.setLayout(new BorderLayout());

bottomPanel.setBackground(Color.DARK_GRAY);

JLabel label3 = new JLabel("I am a new JLABEL for the bottom JPanel", JLabel.CENTER);

label3.setForeground(Color.WHITE);

bottomPanel.add(label3, BorderLayout.CENTER);

gbc.weighty = 0.2;

add(bottomPanel, gbc);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setLocationRelativeTo(null);

pack();

setVisible(true);

}

public static void main(String... args)

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

new GridBagTest();

}

});

}

}

标签:java,swing,jtextfield,jscrollpane,scrollable

来源: https://codeday.me/bug/20190626/1291736.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值