【发布时间】:2016-10-31 23:04:49
【问题描述】:
我需要一个不带滚动条的不可编辑的可自动换行的文本标签/字段/区域,它将随其父级调整大小而没有滚动条。它将用于显示各种大小的文本,但“总是”有足够的空间来显示全文。在极少数情况下,用户将窗口调整得太小以至于无法容纳,我希望它截断行/垂直。
我已经进行了很多搜索,并阅读了我可以在这里找到的任何相关问题,而没有找到问题的根源。我选择了JTextArea,因为它具有自动换行功能。我也尝试了JLabel 的自定义扩展,但问题仍然存在,所以我认为我也可以坚持使用JTextArea。由于多种原因,我非常想避免使用 HTML 方法。这不是我第一次遇到这个问题,我之前通过妥协布局(以不同的方式设计表单)解决了这个问题。这肯定不会是我最后一次面对这个问题,所以我想我需要找到一种方法,而不是不断妥协。
问题在于,虽然这按最初的预期工作并且当窗口被调整为水平更大时,水平缩小窗口不会更新自动换行,因此JTextArea 会被水平截断。
我的测试表明,这仅适用于某些布局管理器,但我不确定问题实际存在于“什么级别”。我还在某处读到该问题仅存在于 Windows 上,但我尚未对此进行验证/测试。我正在使用 Windows 进行开发,所以我所知道的是问题就在这里,并且在 Java 7 和 Java 8 中都存在。
测试不同的布局管理器显示:
- FormLayout:收缩时不重新换行。
- MigLayout:收缩时不重新换行。
- GridBagLayout:它在收缩时会重新换行,但不正确,因此某些文本被隐藏了。
- BorderLayout:按预期工作。
- BoxLayout:如果轴设置为
Y_AXIS,则按预期工作。当设置为X_AXIS时,其行为类似于 FormLayout 或 MigLayout。 - GridLayout:按预期工作。
- CardLayout:按预期工作。
现有应用程序广泛使用 FormLayout,如果不进行大量重写,我无法更改它。将JTextArea 与JPanel 与其中一种工作布局包装在一起,例如BorderLayout,只要其中一种“损坏”的布局在层次结构中被进一步使用,它就没有帮助。似乎有一些信号丢失并且没有到达孩子们,所以我被卡住了,因为我无法真正摆脱 FormLayout 一直到层次结构的顶部。
这里有几个非常相似的现有问题,但很多都是关于 JTextArea 与 JScrollPane 或其他一些细微变化的组合,没有一个可以帮助我找到可行的解决方案。通过尽可能缩小问题范围并提供有效的 SCCEE,我希望不会因为重复而被拒绝。
SCCEE:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import javax.swing.JTextArea;
public class MainFrame {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame window = new MainFrame();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MainFrame() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(new FormLayout(
new ColumnSpec[] {ColumnSpec.decode("pref:grow"),},
new RowSpec[] {RowSpec.decode("pref:grow"),}
));
frame.getContentPane().add(panel, BorderLayout.CENTER);
final JTextArea textArea = new JTextArea();
panel.add(textArea, "1, 1, fill, fill");
textArea.setLineWrap(true);
textArea.setText("Lorem ipsum dolor sit amet, ut eum assum debet tacimates, mei nisl electram moderatius ei, veri semper cotidieque eu pri. In quot noster vocent usu, ne augue voluptaria quo. Ex per malis vocibus. Consequat mediocritatem no vel.");
}
}
【问题讨论】:
标签: java swing layout-manager jtextarea word-wrap