Swing JScrollPane调整大小以适合视口面板

时间:2017-04-30 21:24:11

标签: java swing jscrollpane

我尝试了很多布局管理器,但没有一个可以解决我的问题:

  • 我希望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的视口,但仍会调整文本区域的大小。

1 个答案:

答案 0 :(得分:1)

我不确定我能得到你所要求的,所以请告诉我,如果我完全错过了这一点......

据我所知,Viewport大小由JScrollPane中的组件控制,无论视口发生什么,JScrollPane大小都不会改变。

您要么:

A)将JScrollPane的大小调整为与其内容相同的大小。

我会实现侦听器以查找内容大小更改并相应地调整ScrollPane的大小,但您也需要注意调整整个层次结构的大小。

B)您想要调整视口大小以使其适合JScrollPane吗?你知道没有滚动条。

我遇到了这个问题,并使用ScrollablePanel组件修复了它。检查此answer,按照链接下载.class并使用它来使用调整大小以适合ScrollPane的JPanel。

那些不是非常详细的答案,但在扩展之前我需要更多关于你要做什么的信息。并且您的代码不完整,总是共享一个我们可以CTRL + C / V的代码,并且很容易在最终验证问题。