1

コードに動的に入力している scrollPane があります。問題は、範囲を拡大できないことです。

オンラインで見つけることができる多くのヒントを試しましたが、何も表示されません。

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();
    }
}

わかりましたので、これが私がいるところです。スクロールを取得しますが、1mm しかスクロールできません。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 による優れたアドバイスに加えて、JViewport をいじってはならず、視覚化されたコンポーネントを JScrollPane のビューポートに追加する必要があることを無視して、すべてのコンポーネントを JScrollPane から直接削除し、コンポーネントを直接追加しようとしています。 JScrollPane 自体ではありません。

そのため、コンポーネントを JScrollPane のコンストラクターに渡すことで JScrollPane のビューポートに追加するかsetViewportView(...)、保持するビューを交換する場合は代わりに JScrollPane のメソッドを呼び出すことができます。

余談ですが、より良い変数名、Java 命名基準に準拠した名前 (たとえば、変数名は小文字で始める必要があります)、およびコードに自己コメントを付ける意味のある名前を使用するようにしてください。変数名 B は、これらの推奨事項のいずれにも準拠していません。

また、プログラム全体で適切なレイアウト マネージャーが使用されていません。複数のコンポーネントを JScrollPane に追加したいようです。JScrollPane のビューポートによって保持される JPanel を作成し、それに適切なレイアウト (おそらく GridLayout(....)) を与え、複数のコンポーネントをこの JPanel に追加することを検討してください。

より具体的で有益なヘルプが必要な場合は、SSCCEを作成して投稿することを検討してください。

于 2013-03-24T17:24:48.577 に答える