1

我有一个滚动窗格,我在我的代码中动态填写。问题是我无法让它扩大范围。

我已经尝试了很多可以在网上找到的提示,但没有任何提示出现。

我循环出 10 个组件,但大小始终保持不变。

  B = new JScrollPane();
     B.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
       B.setViewportBorder(null);

          B.setBounds(12, 53, 330, 400);

       //making the scrollPane

       loadArtists(country); 


       // loading the method with the content


    contentPane.add(B);

       // the content method

               public void loadArtists(String country){
    ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister

    B.removeAll();

    String [] genre =Methods.getGenreArtist(country);                                           
    Component2[] comp = new Component2[10]; // skriv ut infohållare

    for (int i = 0; i < top10A.size(); i++) {
        comp[i] = new Component2(this);
        comp[i].setBounds(0, 0, 327, 68);
        comp[i].setLocation(0, 0 + space2);
        ImageIcon[] panel= new ImageIcon[10];

        int lyssnare = top10A.get(0).getListeners();

        try {
                URL url2 = new             URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM"))));  
                panel[i]= new ImageIcon(url2);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg"));
                e.printStackTrace();

            }

        comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,"");

        B.add(comp[i]);
        space2 = space2 + 75;

               //B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

         B.repaint();
    }
}

好的,这就是我所在的位置。我会得到卷轴,但它只能让我滚动 1 毫米。如果我删除 setBounds 整个滚动窗格就会消失。我不知道如何解决它。对不起,如果我有点愚蠢,但这是我的第一个“真正的程序”:

   scroll1 = new JScrollPane();
     scroll1.setViewportBorder(null);

         scroll1.setBounds(12, 53, 330, 400);

          setComponents = new JPanel();

 contentPane.add(scroll1);


 scroll1.setViewportView(setComponents);
 GroupLayout gl_testP = new GroupLayout(setComponents);
 gl_testP.setHorizontalGroup(
    gl_testP.createParallelGroup(Alignment.LEADING)
        .addGap(0, 307, Short.MAX_VALUE)
 );
 gl_testP.setVerticalGroup(
    gl_testP.createParallelGroup(Alignment.LEADING)
        .addGap(0, 398, Short.MAX_VALUE)
 );
 setComponents.setLayout(gl_testP);

 loadArtists(country);     




 public void loadArtists(String country){
    ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister

    setComponents.removeAll();

    String [] genre =Methods.getGenreArtist(country);                                           
    Component2[] comp = new Component2[10]; // skriv ut infohållare

    for (int i = 0; i < top10A.size(); i++) {
        comp[i] = new Component2(this);
        comp[i].setBounds(0, 0, 327, 68);
        comp[i].setLocation(0, 0 + space2);
        ImageIcon[] panel= new ImageIcon[10];

        int lyssnare = top10A.get(0).getListeners();

        try {
                URL url2 = new URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM")))); // skapa array av artist bilder
                panel[i]= new ImageIcon(url2);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg"));
                e.printStackTrace();
                System.out.println(panel[i]+" "+"saknar bild");
            }

        comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,"");


        setComponents.add(comp[i]);
        space2 = space2 + 75;
         scroll1.setViewportView(setComponents);

         //B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

         setComponents.repaint();
    }
}

好的。所以我“修复”了它。

          setComponents.setPreferredSize(new Dimension(1,750));

这不是最优的,因为它不会让我动态地增加内容。但是,当我不需要循环超过 10 个组件时,这并不重要。

4

2 回答 2

4
B.setBounds(12, 53, 330, 400);

不要在组件上使用 setBounds() 方法。

Swing 旨在与布局管理器一起使用。当添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,滚动条将自动出现。布局管理器为您进行这些计算。

有关更多信息和示例,请参阅 Swing 教程中有关使用布局管理器的部分。

于 2013-03-24T17:16:40.770 回答
3

除了 Rob Camick 给出的很好的建议之外,您还直接从 JScrollPane 中删除所有组件并尝试将组件直接添加到 JScrollPane 中,而忽略了 JViewport 不应该被弄乱并且需要将可视化组件添加到 JScrollPane 的视口中,而不是 JScrollPane 本身。

因此,您可以通过将组件传递到 JScrollPane 的构造函数中来将组件添加到 JScrollPane 的视口中,或者setViewportView(...)如果您想交换它所拥有的视图,则可以改为调用 JScrollPane 的方法。

顺便说一句,请尝试使用更好的变量名称、符合 Java 命名标准的名称(例如变量名称应以小写字母开头)以及使您的代码自注释的有意义的名称。变量名 B 不符合这些建议中的任何一个。

此外,您的整个程序都缺乏体面的布局管理器。您似乎希望向 JScrollPane 添加多个组件。考虑创建一个由 JScrollPane 的视口持有的 JPanel,给它一个适当的布局,可能是 GridLayout(....) 并将多个组件添加到这个 JPanel。

如需更具体和信息丰富的帮助,请考虑创建和发布SSCCE

于 2013-03-24T17:24:48.577 回答