我尝试了很多布局管理器,但是没有一个可以解决我的问题:
我希望scrollPane中的项目保持其大小(首选或最小),而不要调整大小(减小)以适合视口面板。因为如果它是一个JTextArea,并且文本区域具有空白并且它大于视口,那么它将减小它,因此将不显示空白文本区域。我希望显示空白文本区域以解决外观问题。
我使用BoxLayout将一个项目堆叠在一起,在我看来,对于文本区域,setMinimum方法失败。
如果文本区域中有空格,那么ScrollPane的滚动条将不会出现,而是仅显示它没有空白。
有什么办法吗?
JScrollPane materialPane = new FScrollPane();
this.materialPaneView = new TPanel();
this.materialPaneView.setMinimumSize(new Dimension((int)(WIDTH*0.95), (int)(HEIGHT/2)));
this.materialPaneView.setLayout(new BoxLayout(this.materialPaneView, BoxLayout.Y_AXIS));
materialPane.setViewportView(materialPaneView);
materialPane.setMinimumSize(new Dimension((int)(WIDTH*0.95), (int)(HEIGHT/2)));
for(Material mat: this.unit.getMaterial()){
this.addMaterial(mat);
}
centerPanel.add(sectionPane);
centerPanel.add(exercisePane);
centerPanel.add(materialPane);
this.add(upperPanel, BorderLayout.NORTH);
this.add(centerPanel, BorderLayout.CENTER);
public void addMaterial(Material mat){
JTextField matName = new JTextField(30);
JPanel fieldButtonPanel = new TPanel();
fieldButtonPanel.setLayout(new GridLayout(1,2));
JPanel fieldPanel = new TPanel(new FlowLayout(FlowLayout.LEFT));
JPanel deleteMatButtonPanel = new TPanel(new FlowLayout(FlowLayout.RIGHT));
matName.setText(mat.getName());
matName.setMaximumSize(new Dimension(FFont.def.getSize()*20, 30));
fieldPanel.add(matName);
JButton deleteMat = new JButton("Delete Material");
deleteMatButtonPanel.add(deleteMat);
fieldButtonPanel.add(fieldPanel);
fieldButtonPanel.add(deleteMatButtonPanel);
fieldButtonPanel.setAlignmentX(LEFT_ALIGNMENT);
JTextArea matText = new FTextArea(mat.getDesc(), (int)(WIDTH*0.95), (int)(HEIGHT/3.4));
matText.setMinimumSize(new Dimension((int)(WIDTH*0.95), (int)(HEIGHT/3.5)));
/*matText.setMaximumSize(new Dimension((int)(WIDTH*0.95), (int)(HEIGHT/3.4)));*/
matText.setText(mat.getDesc());
matText.setAlignmentX(LEFT_ALIGNMENT);
this.materialPaneView.add(fieldButtonPanel);
this.materialPaneView.add(matText);
matName.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
mat.setName(matName.getText());
}
});
HEIGHT和WIDTH是常量,TPanel FScrollPane是我预定义的透明面板。 BoxLayout面板是scrollPane的视口,并且仍然会调整文本区域的大小。
最佳答案
我不确定我是否能满足您的要求,所以请告诉我是否完全错过了重点...
据我所知,视口大小是由JScrollPane内部的组件控制的,无论视口发生什么变化,JScrollPane的大小都不会改变。
您要么想要:
A)将JScrollPane的大小调整为与其内容相同的大小。
我将实现侦听器以查找内容大小更改并相应地调整ScrollPane的大小,但是您也需要注意调整整个层次结构的大小。
B)您想调整视口的大小,使其适合JScrollPane吗?知道没有滚动条。
我遇到了这个问题,并通过使用ScrollablePanel组件进行了修复。选中此answer,单击链接以下载.class并使用它来调整大小以适合ScrollPane的JPanel。
这些选项非常详细,但在扩展之前,我将需要更多有关您尝试执行的操作的信息。而且您的代码不完整,请始终共享我们可以按CTRL + C / V组合的代码,并最终验证问题。