【发布时间】:2014-02-22 14:58:53
【问题描述】:
我的 JFrame 右侧有一个 JXTaskPaneContainer,其中包含超链接和标签。窗口的主要部分应该是:
- 左侧的一大块区域用于文本
- 右侧较小的区域显示消息和操作
现在,问题是添加大量新元素会导致容器向左和文本上方增长:
将JXTaskPaneContainer 包含在javax.swing.JScrollPane (video/yt) 中时会变得更加奇怪。
问题似乎出在 JXLabel 上。 我怀疑是换行? 任何想法如何解决这个问题?
[示例] 根据要求的独立示例。 Full source on github.
package layoutproblemSSCEC;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.jdesktop.swingx.JXButton;
import org.jdesktop.swingx.JXLabel;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
public class SwingWindow {
private JFrame frame;
String dolorem = "Sed ut perspiciatis unde omnis iste natus error sit "
+ "voluptatem accusantium doloremque laudantium, totam rem aperiam, "
+ "eaque ipsa quae ab illo inventore veritatis et quasi architecto "
+ "beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem "
+ "quia voluptas sit aspernatur aut odit aut fugit, sed quia "
+ "consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. "
+ "Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, "
+ "consectetur, adipisci velit, sed quia non numquam eius modi tempora "
+ "incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut "
+ "enim ad minima veniam, quis nostrum exercitationem ullam corporis "
+ "suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? "
+ "Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse "
+ "quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat "
+ "quo voluptas nulla pariatur?";
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SwingWindow window = new SwingWindow();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public SwingWindow() {
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 JXTaskPaneContainer panels = new JXTaskPaneContainer();
JScrollPane scrollpanel = new JScrollPane(panels);
Container content = frame.getContentPane();
content.add(new JTextArea(dolorem), BorderLayout.CENTER);
content.add(scrollpanel, BorderLayout.EAST);
content.add(new JXButton(new AbstractAction("Click me") {
public void actionPerformed(ActionEvent arg0) {
JXTaskPane panel = new JXTaskPane("test");
JXLabel lbl = new JXLabel(dolorem);
lbl.setLineWrap(true);
panel.add(lbl);
panels.add(panel);
}
}), BorderLayout.NORTH);
panels.add(new JXTaskPane("Click the button, then resize"));
}
}
【问题讨论】:
-
检查 layoutManager - taskPane(或容器,忘记细节)需要一个尊重 prefSize 的管理器。如果这没有帮助,请发布 SSCCE 来证明问题
-
谢谢。我会尝试一下 GridBagLayout。
-
repeating:显示一个 SSCCE 来证明问题 - 我很确定你会得到一个简洁的答案 ;-)
-
完成。 :) 查看链接后的完整代码。这是我能做到的尽可能简洁。如果你在 Eclipse 中克隆它,我认为 Maven 会处理依赖项(swingx-all-1.6.5-1)。
-
不,这不是 SSCCE:它既不短也不独立,也不发布 here ;-) 重现一个简单的布局问题不应该花费超过 50 - 80 行代码.不过,很高兴知道您的 swingx 版本,因此我可以针对正确的版本运行您未来的 SSCCE。