I';我在调整JavaSwing组件的大小时遇到了一些问题

I';我在调整JavaSwing组件的大小时遇到了一些问题,java,swing,user-interface,Java,Swing,User Interface,我正在构建一个Java Swing应用程序,我希望它能以这种方式工作: 调整窗口大小时,JScrollPane对象(位于JSplitPane中)应参考当前窗口宽度重新确定其最小、最大和首选大小的尺寸 我在ComponentAdapter类的方法componentResized()上修复了此设置,但是,它不能像假设必须做的那样工作 这是代码。我希望你能在你的电脑上测试它,并能帮助我 非常感谢你的时间 import java.awt.event.*; import java.awt.geom.*;

我正在构建一个Java Swing应用程序,我希望它能以这种方式工作:

调整窗口大小时,
JScrollPane
对象(位于
JSplitPane
中)应参考当前窗口宽度重新确定其最小、最大和首选大小的尺寸

我在
ComponentAdapter
类的方法
componentResized()
上修复了此设置,但是,它不能像假设必须做的那样工作

这是代码。我希望你能在你的电脑上测试它,并能帮助我

非常感谢你的时间

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


public class ComVisor extends JFrame
{
private JList imagesList;
private JPanel imagePanel;
private JSplitPane mainPanel;
private JScrollPane scrollPanelRight;
private int width;

public ComVisor(String nameApplication)
{
    setFrame(nameApplication);
    setComponents();
}

private void setFrame(String nameApplication)
{
    setLayout(new BorderLayout(1, 3));
    setTitle(nameApplication);
    setMinimumSize(new Dimension(400, 200));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));
    setLocationRelativeTo(null);

    this.addWindowListener(
        new WindowAdapter() 
        {
            @Override
            public void windowClosing(WindowEvent e) 
            { 
                JOptionPane.showMessageDialog(ComVisor.this, nameApplication + "-Salida"); 

                return;
            }
        }
    );
    this.addComponentListener(
        new ComponentAdapter()
        {
            @Override
            public void componentResized(ComponentEvent E)
            {   
                width = getWidth();

                scrollPanelRight.setPreferredSize(new Dimension(width / 3, 0));
                scrollPanelRight.setMinimumSize(new Dimension(width / 7, 0));
                scrollPanelRight.setMaximumSize(new Dimension(width / 5 * 4, 0));

                return;         
            }
        }
    );  
}

private void setComponents()
{
    String[] a = {"dsdsdsd", "dsdsdkkhskj", "dskhkjdhskjdhksdh", "sdskdhskjhds"};
    JButton b = new JButton("Soy un boton xD");
    JPanel p = new JPanel();
    imagesList = new JList(a);
    p.add(b);
    imagesList.setVisibleRowCount(100);
    scrollPanelRight = new JScrollPane(imagesList);
    mainPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPanelRight, p);
    add(mainPanel, BorderLayout.CENTER);

    return;
}

private class Manejador implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent listener)
    {
        return;
    }
}
}
这是主类,它调用Comvisor对象

import static javax.swing.SwingUtilities.invokeLater;

public class Principal
{
public static void main(String[] args)
{
    invokeLater(
        new Runnable()
        {
            @Override
            public void run()
            {
                new ComVisor("ComVisor").setVisible(true);

                return;
            }
        }
    );

    return;
}
}

仅供参考:您可以省略main方法以及runnable的run方法中的return语句。任何void方法的末尾都有一个隐式的return语句,您不需要写下它。“当您调整窗口大小时,JScrollPane对象(位于JSplitPane中)应该以当前窗口宽度为参考重新确定其最小、最大和首选大小的尺寸。”为什么?你这样做的目的是什么?注意1)对于当前布局,
scrollPanelRight
根据可用空间展开和收缩。2) 当尺寸发生变化时,您不应该弄乱首选尺寸或最大尺寸。看到了吗?拆分窗格的分隔符真的应该在调整窗口大小时移动吗?请参阅,如果是,请使用类似于
mainPanel.setResizeWeight(.3)的内容谢谢你的帮助!仅供参考:您可以省略main方法以及runnable的run方法中的return语句。任何void方法的末尾都有一个隐式的return语句,您不需要写下它。“当您调整窗口大小时,JScrollPane对象(位于JSplitPane中)应该以当前窗口宽度为参考重新确定其最小、最大和首选大小的尺寸。”为什么?你这样做的目的是什么?注意1)对于当前布局,
scrollPanelRight
根据可用空间展开和收缩。2) 当尺寸发生变化时,您不应该弄乱首选尺寸或最大尺寸。看到了吗?拆分窗格的分隔符真的应该在调整窗口大小时移动吗?请参阅,如果是,请使用类似于
mainPanel.setResizeWeight(.3)的内容谢谢你的帮助!