Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_User Interface_Layout Manager_Miglayout - Fatal编程技术网

Java中的自下而上布局,具有动态大小调整功能

Java中的自下而上布局,具有动态大小调整功能,java,user-interface,layout-manager,miglayout,Java,User Interface,Layout Manager,Miglayout,我正试图建立一个通用的聊天界面,聊天“泡泡”从底部填满。我是Java新手,不知道该使用哪个布局管理器。我曾尝试使用BoxLayout和顶部的一些胶水来向下推内部JPanel,但这迫使我在其上设置“setMaximumSize”,从而防止根据“气泡”内的文本调整大小 您可以在上面看到预期的结果。每个气泡行都是一个JPanel。它们都在底部对齐。应该允许气泡随着文本内容扩展到某个最大值,然后它应该自动换行。用户图像应始终与顶部对齐,即使气泡变为多行。但是,时间戳应与气泡对齐 任何帮助都将不胜感激。

我正试图建立一个通用的聊天界面,聊天“泡泡”从底部填满。我是Java新手,不知道该使用哪个布局管理器。我曾尝试使用BoxLayout和顶部的一些胶水来向下推内部JPanel,但这迫使我在其上设置“setMaximumSize”,从而防止根据“气泡”内的文本调整大小

您可以在上面看到预期的结果。每个气泡行都是一个JPanel。它们都在底部对齐。应该允许气泡随着文本内容扩展到某个最大值,然后它应该自动换行。用户图像应始终与顶部对齐,即使气泡变为多行。但是,时间戳应与气泡对齐

任何帮助都将不胜感激。我想我应该使用一些其他的布局管理器,比如MigLayout而不是BoxLayout

更新1: 这似乎在起作用:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.JPanel;

import javax.swing.BoxLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Panel;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;


public class FormTest extends JFrame {

public static void main(String[] args) {
    new FormTest();
}

@SuppressWarnings("deprecation")
public FormTest() {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Test");
    this.setSize(1000, 500);
    this.setMinimumSize(new Dimension(700, 300));
    this.setLocationRelativeTo(null);

    //Bubble panel
    JPanel bubble = new JPanel();
    bubble.setBackground(Color.RED);
    bubble.setLayout(new BoxLayout(bubble, BoxLayout.X_AXIS));

    //Container panel
    JPanel container = new JPanel();
    container.setBackground(Color.CYAN);

    FormLayout layout = new FormLayout("fill:default:grow", "fill:default:grow");
    PanelBuilder builder = new PanelBuilder(layout);
    CellConstraints cc = new CellConstraints();

    layout.appendRow(new RowSpec("pref"));
    builder.add(bubble, cc.xy(1, layout.getRowCount()));        

    container.setLayout(layout);

    //Add container panel to window
    getContentPane().add(builder.getPanel(), BorderLayout.CENTER);

    JLabel lblAaaa = new JLabel("<html>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</html>");
    bubble.add(lblAaaa);

    //Create the window
    this.setVisible(true);
}

}
导入java.awt.Dimension;
导入javax.swing.JFrame;
导入javax.swing.UIManager;
导入javax.swing.JPanel;
导入javax.swing.BoxLayout;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Panel;
导入com.jgoodies.forms.builder.PanelBuilder;
导入com.jgoodies.forms.layout.CellConstraints;
导入com.jgoodies.forms.layout.FormLayout;
导入com.jgoodies.forms.layout.ColumnSpec;
导入com.jgoodies.forms.layout.RowSpec;
公共类FormTest扩展了JFrame{
公共静态void main(字符串[]args){
新的FormTest();
}
@抑制警告(“弃用”)
公共表单测试(){
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
本条。设定标题(“测试”);
此.setSize(1000500);
此设置最小尺寸(新尺寸(700300));
此.setLocationRelativeTo(空);
//泡沫板
JPanel bubble=新的JPanel();
气泡。背景(颜色。红色);
bubble.setLayout(新的BoxLayout(bubble,BoxLayout.X_轴));
//集装箱面板
JPanel容器=新的JPanel();
容器.立根背景(颜色.青色);
FormLayout布局=新的FormLayout(“填充:默认值:增长”,“填充:默认值:增长”);
PanelBuilder=新的PanelBuilder(布局);
CellConstraints cc=新的CellConstraints();
布局。附录行(新的行规范(“pref”));
add(bubble,cc.xy(1,layout.getRowCount());
容器。设置布局(布局);
//将容器面板添加到窗口
getContentPane().add(builder.getPanel(),BorderLayout.CENTER);
JLabel lblAaaa=新JLabel("Lorem Ipsum仅仅是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是该行业的标准虚拟文本,当时一位不知名的印刷商拿起一个打印工具,争先恐后地制作了一本字体样本书。它不仅存活了五个世纪,而且还跨越到了电子排版,仍然是埃森理论上没有变化。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表单的发布而流行,最近随着桌面出版软件(如Aldus PageMaker,包括Lorem Ipsum版本)的发布而流行。”;
添加气泡(lblAaaa);
//创建窗口
此.setVisible(true);
}
}

如果您正在使用Swing,您可以尝试使用jgoodies中的表单布局。 请看这里:

首先定义间隔(“填充:默认值:增长”),然后将面板动态添加到底部

您可以这样定义布局:

FormLayout layout = new FormLayout("file:default:grow","fill:default:grow");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();

layout.appendRow(new RowSpec("pref"));
buiulder.add(new Panel(), cc.xy(1,layout.getRowCount()));

我已经在包含聊天记录的演示应用程序中使用了此方法。

抱歉,我不完全理解。我已经发布了一个到目前为止的更新。您好,是的,这看起来相当不错。“container.setLayout(layout)”;'您不需要,因为生成器已经在内部为您执行此操作。现在将容器面板放在JScrollbar中,应该可以了。提示:要在气泡之间留出空间,只需在插入新行(气泡)之前向布局中添加一个新的空行,然后插入气泡本身:layout.appendRow(new RowSpec(“25px”);layout.appendRow(新建行规范(“pref”);builder.add(my2ndubblepanel,cc.xy(1,layout.getRowCount());提示2:您也可以直接执行:新建PanelBuilder(layout,container);删除getContentPane().add(builder.getPanel(),BorderLayout.CENTER);