Java Swing:按钮上方的文本自动调整大小?
我正在寻找一种方法来实现以下目标: 有一个固定宽度的JDialog 在它里面是一个JTextArea(或者你建议的更好的组件…),它接收不同长度的文本(0到30行之间的某个地方) 文本下面是一个按钮 对话框的高度会自动调整,以确保显示所有文本和按钮 我找到的最接近的解决方案是这个,但是在自动断线之后,JTextArea似乎不知道它有多大Java Swing:按钮上方的文本自动调整大小?,java,swing,layout,Java,Swing,Layout,我正在寻找一种方法来实现以下目标: 有一个固定宽度的JDialog 在它里面是一个JTextArea(或者你建议的更好的组件…),它接收不同长度的文本(0到30行之间的某个地方) 文本下面是一个按钮 对话框的高度会自动调整,以确保显示所有文本和按钮 我找到的最接近的解决方案是这个,但是在自动断线之后,JTextArea似乎不知道它有多大 public PleaseResize(){ super(); Container cp = this.getContentPane(
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后尝试使用这些行。现在它可以工作了。。。关键是先打包(),然后使用代码,然后再打包。这么多的包装,但它现在起作用了!谢谢:)