Java 内容动态更改时调整Swing组件的大小
对于两个组件JTextField和jcombox,我有相同的问题,我认为我正在寻找的解决方案可以解决所有组件的问题 我已经将组件的大小设置为默认值,因此它们的大小适合我提供给它的初始内容。当我将组件的内容更改为超出组件的区域时,我看不到整个文本,我希望我的组件调整大小以适应文本 我怎样才能做到这一点 更新:Java 内容动态更改时调整Swing组件的大小,java,swing,autoresize,Java,Swing,Autoresize,对于两个组件JTextField和jcombox,我有相同的问题,我认为我正在寻找的解决方案可以解决所有组件的问题 我已经将组件的大小设置为默认值,因此它们的大小适合我提供给它的初始内容。当我将组件的内容更改为超出组件的区域时,我看不到整个文本,我希望我的组件调整大小以适应文本 我怎样才能做到这一点 更新: private class ComboBoxRenderer extends JLabel implements ListCellRenderer { private sta
private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
private static final long serialVersionUID = 752379460716217273L;
Dimension maxSize=new Dimension();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
Dimension size = getPreferredSize();
if(maxSize.width<size.width)
maxSize.width=size.width;
if(maxSize.height<size.height)
maxSize.height=size.height;
resolutionDescriptor_ComboBox.setPreferredSize(maxSize);
return this;
}
}
框架上的pack()只放大了文本字段,我怎样才能同样放大组合框
更新:
private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
private static final long serialVersionUID = 752379460716217273L;
Dimension maxSize=new Dimension();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
Dimension size = getPreferredSize();
if(maxSize.width<size.width)
maxSize.width=size.width;
if(maxSize.height<size.height)
maxSize.height=size.height;
resolutionDescriptor_ComboBox.setPreferredSize(maxSize);
return this;
}
}
私有类ComboBoxRenderer扩展JLabel实现ListCellRenderer{
私有静态最终长serialVersionUID=752379460716217273L;
维度maxSize=新维度();
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
setText(value.toString());
维度大小=getPreferredSize();
如果(maxSize.width在框架上执行一个pack()来调整组合框的大小,您可以尝试:
comboBox.setModel( comboBox.getModel() );
我相信这会导致重新计算组合框的首选大小。当然,您需要再次执行pack()
编辑:
添加了一个简单的SSCCE,展示了这一点:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ComboBoxTest3 extends JFrame implements ActionListener
{
JComboBox comboBox;
JTextField textField;
public ComboBoxTest3()
{
String[] tabs = {"one", "two", "three", "four", "five", "six", "seven" };
DefaultComboBoxModel model = new DefaultComboBoxModel(tabs);
comboBox = new JComboBox( model );
textField = new JTextField("hello");
add(comboBox, BorderLayout.WEST );
add(textField, BorderLayout.EAST );
JButton button = new JButton("Pack");
button.addActionListener( this );
add(button, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e)
{
textField.setText("hello there!");
comboBox.addItem("some longer text");
comboBox.setModel( comboBox.getModel() );
pack();
}
public static void main(String[] args)
{
JFrame frame = new ComboBoxTest3();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
JComboBox
有一种方法,用于根据参数的长度计算组件的首选宽度。请尝试
使用doLayout()
和一些revalidate()
或repaint()代替pack()
在swing中,组件的大小取决于其容器的布局。您使用什么布局?这不是一个好的解决方案。您永远不应该在渲染器中设置/更改swing组件的属性。为什么这不是一个好的解决方案?因为它会在每次帧接收到焦点时遍历代码,并且循环将对每个项目执行在列表中,这就是你的意思吗?不,没有改变,它保持不变…我在我之前尝试的pack()之前添加了这个。也许可以设置我自己的渲染器,并根据列表中最大的组件为它定义新的大小…我会看到它是如何工作的。pack()是正确的使用方法。你不应该使用doLayout().doLayout可能会增加组件的大小,但框架大小不会改变,因此组件将被截断。不需要使用包或doLayout,没有它们也可以正常工作