Java Swing:按钮上方的文本自动调整大小?

Java Swing:按钮上方的文本自动调整大小?,java,swing,layout,Java,Swing,Layout,我正在寻找一种方法来实现以下目标: 有一个固定宽度的JDialog 在它里面是一个JTextArea(或者你建议的更好的组件…),它接收不同长度的文本(0到30行之间的某个地方) 文本下面是一个按钮 对话框的高度会自动调整,以确保显示所有文本和按钮 我找到的最接近的解决方案是这个,但是在自动断线之后,JTextArea似乎不知道它有多大 public PleaseResize(){ super(); Container cp = this.getContentPane(

我正在寻找一种方法来实现以下目标:

有一个固定宽度的JDialog

在它里面是一个JTextArea(或者你建议的更好的组件…),它接收不同长度的文本(0到30行之间的某个地方)

文本下面是一个按钮

对话框的高度会自动调整,以确保显示所有文本和按钮

我找到的最接近的解决方案是这个,但是在自动断线之后,JTextArea似乎不知道它有多大

    public PleaseResize(){
    super();

    Container cp = this.getContentPane();
    cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS));

    JTextArea area = new JTextArea();

    area.setColumns(20);
    area.setLineWrap(true);
    area.setEditable(false);
    area.setWrapStyleWord(true);
    area.setText("Once upon a midnight dreary, while I pondered, weak and weary, over many a quaint an curious volume of forgotten lore.");


    cp.add(area);

    cp.add(new JButton("Hallo"));


    this.pack();

}
很遗憾,滚动文本不是一个选项

在此之前,我曾问过这是一种稍微不同的方式:,但也许JTextArea毕竟是错误的组件?我是否使用了错误的布局经理?不过,他们似乎都无法确定对话框应该有多大。为什么在文本外部添加换行符后,JTextArea无法传达其高度


以下是工作代码:

    public PleaseResize() throws BadLocationException {
    super();

    Container cp = this.getContentPane();
    cp.setLayout(new BorderLayout());

    JTextArea area = new JTextArea();
    area.setColumns(20);
    area.setLineWrap(true);
    area.setEditable(false);
    area.setWrapStyleWord(true);
    area.setText("Once upon a midnight dreary, while I pondered, weak and weary, over many a quaint an curious volume of forgotten lore.");
    System.out.println(area.getLineCount());

    JScrollPane pane = new JScrollPane(area);
    cp.add(pane, BorderLayout.CENTER);
    cp.add(new JButton("Hallo"), BorderLayout.SOUTH);

    this.pack();
    this.pack();


}

打包两次对我来说仍然有点奇怪,但它确实解决了调整大小的问题:)。

试试这种方法,根据模型调整JTextArea的大小

        Rectangle modelToView = area.modelToView(area.getDocument().getLength());
        if (modelToView != null) {
            area.setSize(area.getWidth(), Math.max(area.getHeight(), modelToView.height + modelToView.y));
            area.doLayout();
        }

我很想念JScrollPane,Oracle中的rest将介绍如何使用JTextArea/JScrollPane使用HTML感知组件和CSS限制宽度。该组件将达到其需要的高度。请参阅演示。我现在严重怀疑我的理智:正如上面的固定代码所示,Ezequiel的代码似乎没有任何作用,因为它只需调用pack()两次而不是一次。。。这是一个Java错误,技术上我不应该做的事情,还是它的工作原理?代码对于我需要这个表单的实际情况似乎是必要的!(一个稍微复杂一些的对话框,其中包含更多的JPanel和JLabel)。我喜欢有一个解决方案,但这仍然让我困惑不已-_-这看起来确实很有希望,但我得到的modelToView方法为null。Javadoc声明“在确定组件大小之前,无法计算布局”。我怀疑这可能是问题所在,但这不正是让我回到最初的问题:弄清楚JTextArea的大小吗?在打包jframe后尝试使用这些行。现在它可以工作了。。。关键是先打包(),然后使用代码,然后再打包。这么多的包装,但它现在起作用了!谢谢:)