上下文:在flashcard应用程序中,我有一个CardData
(表示闪存卡一侧的数据结构)的视图。它最基本的形式是String text
。该视图(称为CardDataView
)由text
内不可编辑的JTextArea
中的JScrollPane
组成。
有一次,我需要(垂直)排列一堆这些CardDataView
,所以我把它们放在一个垂直的Box
中。
问题在于:当我将窗口从“首选”大小(由pack
确定)展开然后再调整大小时,JScrollPane会添加一个水平滚动条,并允许我在文本域。基本上,它会在不应该的时候调整文本区域的大小。
这是我的代码(简化和简化):
public class DebugTest {
public static void main(String[] args) {
CardDataView cdv = new CardDataView(new CardData(
"Lorem ipsum dolor sit amet filler filler filler"));
JFrame frame = new JFrame();
frame.add(new JScrollPane(cdv), BorderLayout.CENTER);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class CardData {
private String text; // text on the card
/*
* NOTE: This class has been simplified for SSCCE purposes. It's not really
* just a String field in production; rather, it has an image and other
* properties.
*/
public CardData(String text) {
super();
this.text = text;
}
public String getText() {
return text;
}
}
class CardDataView extends Box {
private JTextArea txtrText; // the text area for the text
/*
* NOTE: As with CardData, this class has been simplified. It's not just a
* JTextArea; it's also an ImageView (custom class; works fine), among other
* things.
*/
public CardDataView(CardData data) {
super(BoxLayout.Y_AXIS);
txtrText = new JTextArea();
txtrText.setLineWrap(true);
txtrText.setRows(3);
txtrText.setEditable(false);
txtrText.setWrapStyleWord(true);
final JScrollPane scrollPane = new JScrollPane(txtrText);
add(scrollPane);
txtrText.setText(data.getText());
}
}
现在,真正让我困惑的东西(除非我错了)是如果我基本上内联数据和视图类,只需创建一个带有文本和滚动的文本区域窗格(即使设置相同的行数,相同的换行设置等),它的行为也符合预期。可能会发生什么?
关注:
- 所有进口都是有序的。
- 如果您想知道为什么CardLayoutView
是Box
:在制作中,它不仅仅是一个文本框。当它是JPanel
而我setLayout
而不是super
时,会发生同样的错误。
- 如果我根本不使用CardData
类(并手动设置文本区域的文本),则会发生同样的故障。
有什么想法吗?
答案 0 :(得分:2)
发表评论回答:
将GridBagLayout
与GridBagConstraints.VERTICAL/NONE
一起用作gridBagLayoutObject.fill
值,而不是BoxLayout
。由于在CENTER
的{{1}}添加组件时,JFrame
从不尊重BorderLayout
组件的preferredSize()
。因此,请尝试将您的资料添加到CENTER
,然后将此JPanel
放在JPanel
的{{1}}。