Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 固定宽度但流体高度组件-可能吗?_Java_Height_Components_Fluid_Fixed Width - Fatal编程技术网

Java 固定宽度但流体高度组件-可能吗?

Java 固定宽度但流体高度组件-可能吗?,java,height,components,fluid,fixed-width,Java,Height,Components,Fluid,Fixed Width,如果在组件上使用setPreferredSize(),它将固定宽度和高度。因此,如果我只想要一个固定的宽度,并根据需要调整高度以将内容容纳到受约束的宽度中,这是不好的 考虑一段HTML文本。在浏览器窗口中,字符串将自动换行,并调整其所需的高度,使其符合可用宽度。因此,如果我们固定浏览器的宽度,文本的高度将保持流动 组件能否实现同样的效果?具体来说,是一个JPanel 请注意,我相信setMaximumSize()会做我想做的事情-允许我设置最大宽度,并将高度设置为某个巨大的值,这样它就永远不会比

如果在组件上使用setPreferredSize(),它将固定宽度和高度。因此,如果我只想要一个固定的宽度,并根据需要调整高度以将内容容纳到受约束的宽度中,这是不好的

考虑一段HTML文本。在浏览器窗口中,字符串将自动换行,并调整其所需的高度,使其符合可用宽度。因此,如果我们固定浏览器的宽度,文本的高度将保持流动

组件能否实现同样的效果?具体来说,是一个JPanel

请注意,我相信setMaximumSize()会做我想做的事情-允许我设置最大宽度,并将高度设置为某个巨大的值,这样它就永远不会比我指定的更宽,但有足够的高度可以生长。然而,系统似乎完全忽略了这一功能。例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JViewport;

public class TMSApp
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("TestMaximumSize"); 
        Container container = frame.getContentPane(); 
        container.setBackground(Color.RED); 

        container.setLayout(new BorderLayout() ); 

        JViewport viewport = new JViewport(); 
        viewport.setBackground(Color.BLACK); 
        viewport.setPreferredSize(new Dimension(640, 480) ); 
        container.add(viewport, BorderLayout.CENTER); 

        JPanel testPanel = new JPanel(); 
        testPanel.setBackground(Color.WHITE); 
        testPanel.setMaximumSize(new Dimension(100, 9999) ); 
        //testPanel.setPreferredSize(new Dimension(100, 9999) ); 

        viewport.setView(testPanel); 

        testPanel.setLayout(new BoxLayout(testPanel, BoxLayout.Y_AXIS) ); 

        testPanel.add(new JLabel("<html>This is a very long HTML label " 
                                    + "that should adapt to the width of " 
                                    + "the parent container by wrapping text, " 
                                    + "just as it would in a web page " 
                                    + "constrained to the window width.</html>") ); 

        frame.setVisible(true); 
        frame.pack(); 

    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JViewport;
公共类应用程序
{
公共静态void main(字符串[]args)
{
JFrame=新JFrame(“TestMaximumSize”);
Container=frame.getContentPane();
容器。立根背景(颜色。红色);
container.setLayout(新的BorderLayout());
JViewport viewport=新的JViewport();
viewport.setBackground(颜色:黑色);
viewport.setPreferredSize(新维度(640480));
添加(视口、边框布局、中心);
JPanel testPanel=newjpanel();
测试面板.立根背景(颜色.白色);
testPanel.setMaximumSize(新尺寸(1009999));
//testPanel.setPreferredSize(新尺寸(1009999));
setView(testPanel);
testPanel.setLayout(新的BoxLayout(testPanel,BoxLayout.Y_轴));
添加(新的JLabel(“这是一个很长的HTML标签”)
+“这应该与宽度相适应”
+通过换行文本创建父容器
+“就像在网页中一样”
+“受限于窗口宽度。”);
frame.setVisible(true);
frame.pack();
}
}
如果您运行此应用程序,尽管我说“宽度不超过100”,但testPanel会尽可能宽,因为它需要将标签保留在一行上。对我来说,这违反了setMaximumSize()的约定

(请注意,如果您使用setPreferredSize(),它确实会正确地约束它-但是我们不能像上面提到的那样在组件上使用setPreferredSize(),因为它也会固定高度,而不是给它一些流动性-是的,setMaximumSize()最终会限制高度,但它是可以接受的)

你知道我如何控制宽度,但根据需要调整高度吗

在记录中,我想把一大堆的面板添加到一个大的面板中,它被封装在一个JScLanPanel中,因此它被用作一个带有面板而不是标签的列表。我认为必须将大的面板侧向滚动来查看所有的项目是一个坏的UI,所以我希望宽度不比滚动窗格的实际可显示区域SAN滚动条宽,因此HAV。e较小的面板调整其高度,以便将其内容(带有HTML字符串的JLabel)调整到可用宽度。因此,用户只需垂直滚动即可查看所有项目。如上所示,即使手动使用视口+滚动条,也会遇到同样的问题


如果我可以只固定较大面板的宽度,则较小的子面板将自动受宽度约束;或者,如果我可以只固定子面板的宽度,则较大的面板将永远不会比我想要的更宽。)

我添加了对SwingUtilities的调用,以确保您的Swing组件位于事件调度线程上

我让你的GUI工作,但是你需要注意测试面板的高度。如果你可以只设置一个首选宽度或首选高度,而不必同时设置两个,Swing会更好

这是我的代码版本

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;

public class TMSApp implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("TestMaximumSize");
        Container container = frame.getContentPane();
        container.setBackground(Color.RED);
        container.setLayout(new BorderLayout());

        JPanel testPanel = new JPanel();
        testPanel.setBackground(Color.WHITE);
        testPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        testPanel.setPreferredSize(new Dimension(250, 9999));
        testPanel.setLayout(new BoxLayout(testPanel, BoxLayout.Y_AXIS));
        testPanel.add(new JLabel("<html>This is a very long HTML label "
                + "that should adapt to the width of "
                + "the parent container by wrapping text, "
                + "just as it would in a web page "
                + "constrained to the window width.</html>"));

        JScrollPane scrollPane = new JScrollPane(testPanel);
        scrollPane.setHorizontalScrollBarPolicy(
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.getViewport().setPreferredSize(new Dimension(250, 400));

        container.add(scrollPane, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TMSApp());
    }

}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.ScrollPaneConstants;
导入javax.swing.SwingUtilities;
公共类TMSApp实现可运行{
@凌驾
公开募捐{
JFrame=新JFrame(“TestMaximumSize”);
Container=frame.getContentPane();
容器。立根背景(颜色。红色);
container.setLayout(新的BorderLayout());
JPanel testPanel=newjpanel();
测试面板.立根背景(颜色.白色);
testPanel.setBorder(BorderFactory.createEmptyByOrder(10,10,10,10));
testPanel.setPreferredSize(新尺寸(2509999));
testPanel.setLayout(新的BoxLayout(testPanel,BoxLayout.Y_轴));
添加(新的JLabel(“这是一个很长的HTML标签”)
+“这应该与宽度相适应”
+通过换行文本创建父容器
+“就像在网页中一样”
+“受限于窗口宽度。”);
JScrollPane scrollPane=新的JScrollPane(testPanel);
scrollPane.setHorizontalScrollBarPolicy(
ScrollPaneConstants.水平滚动条(从不);
scrollPane.getViewport().setPreferredSize(新维度(250400));
添加(滚动窗格,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(新的TMSApp());
}
}
I a