【问题标题】:miglayout row format: JScrollPane containing a 1-line JTextAreamiglayout 行格式:包含 1 行 JTextArea 的 JScrollPane
【发布时间】:2011-01-11 20:23:31
【问题描述】:
如果需要,我想显示一个带有水平滚动条的单行文本标签。 (没有垂直滚动条,因为我知道它是一行。)
我正在通过包含 JTextArea 的 JScrollPane 实现。
对于布局管理器,我使用的是 MigLayout,但似乎无法弄清楚行格式规范要使用什么。如果我只使用[],那么它在没有水平滚动条的情况下可以正常工作,但是当滚动条出现时,它看起来很糟糕,因为滚动条占用了所有空间。
我想做的是:
- 显示具有恒定高度的 JScrollPane,当滚动条存在时看起来不错,并且在滚动条不存在时有额外的空间
- 显示具有可变高度的 JScrollPane,以便当滚动条不存在时窗格的高度是 1 行文本,或者当滚动条存在时为容纳滚动条的额外空间
- 以仅占用 1 行文本的方式显示 JScrollPane(例如,更改滚动条以占用相关文本右侧的一些水平空间)
有什么建议吗?
【问题讨论】:
标签:
swing
user-interface
jscrollpane
miglayout
【解决方案1】:
有趣的问题(我并没有过分热衷于研究 jpa)
基本上,布局本身并不能做太多事情:scrollPane 的首选项大小因水平滚动条的可见性而异。由客户端代码动态地告诉经理如何处理要覆盖的区域,IMO。下面是一个可以使用的代码-sn-p。
- 它使用一个不可见的虚拟组件,该组件具有可能可见的水平滚动条的固定大小(是的,gals,我知道,应该动态调整该固定大小以适应 scrollPane 水平滚动条的任何高度变化属性 :-)
- 它在 scrollPane 的水平滚动条上安装一个 componentListener,在可见性变化时调整虚拟对象的隐藏模式,并重新验证包含面板。
适用于 Win/Nimbus,但 Metal 中存在故障(可能还有其他 LAF),需要对 diff 进行魔幻数字调整以保持布局稳定
JTextArea area = new JTextArea("starting ", 1, 10);
JScrollPane areaScrollPane = new JScrollPane(area);
areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
Dimension dim = areaScrollPane.getPreferredSize();
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// get the height diff with/out horizontal scrollbar
int diff = dim.height - areaScrollPane.getPreferredSize().height;
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
LC lc = new LC().wrapAfter(2).debug(500);
final MigLayout layout = new MigLayout(lc);
final JPanel panel = new JPanel(layout);
panel.add(new JLabel("OneLineRow"));
panel.add(areaScrollPane);
// create and add an invisible filler
// note: metal needs magic adjust, dont know why
// diff -= 3;
final JComponent dummy = (JComponent) Box.createVerticalStrut(diff);
dummy.setVisible(false);
final String dummyConstraint = "span, hidemode ";
panel.add(dummy, dummyConstraint + "0");
// component listener which adjusts hidemode of filler on
// scrollpane's horizontal scrollbar showing/hiding
ComponentAdapter adapter = new ComponentAdapter() {
/**
* @inherited <p>
*/
@Override
public void componentShown(ComponentEvent e) {
layout.setComponentConstraints(dummy, dummyConstraint + "2");
panel.revalidate();
}
/**
* @inherited <p>
*/
@Override
public void componentHidden(ComponentEvent e) {
layout.setComponentConstraints(dummy, dummyConstraint + "0");
panel.revalidate();
}
};
areaScrollPane.getHorizontalScrollBar().addComponentListener(adapter);
panel.add(new JScrollPane(new JTable(20, 5)), "span");
showInFrame(panel, "one line textArea");
非常欢迎反馈,也许我忽略了一种不那么人为的方法