2017-01-13 11 views
0

これは、プログラムが実行されているクラスです。JScrollPaneが機能しない、ビューポートがパネルをスタッキングしている

import java.awt.Color; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class runClass { 

public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setSize(1366, 768); 
    frame.setVisible(true); 

    JPanel backgroundPanel = new JPanel(); 
    backgroundPanel.setBounds(0, 0, 1366, 768); 
    backgroundPanel.setBackground(Color.PINK); 
    frame.getContentPane().add(backgroundPanel); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(0,1,10,10)); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setBounds(228, 5, 453, 426); 
    scrollPane.setViewportView(panel); 
    scrollPane.setVisible(true); 
    backgroundPanel.setLayout(null); 
    backgroundPanel.add(scrollPane); 

    for (int x = 0; x < 15; x++){ 
     panel.add(new ExerciseList(new Exercise("hello"))); 
    } 

    panel.revalidate(); 
    panel.repaint(); 

} 
} 

これは、コンテナに追加されるパネルです。

import java.awt.Color; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import java.awt.Font; 

public class ExerciseList extends JPanel{ 

    private Exercise exercise; 

    public ExerciseList(Exercise e){ 

     this.exercise = e; 

     setLayout(null); 
     setVisible(true); 
     setBackground(Color.LIGHT_GRAY); 

     JLabel lblName = new JLabel(exercise.getName()); 
     lblName.setFont(new Font("Tahoma", Font.PLAIN, 18)); 
     lblName.setBounds(229, 11, 209, 22); 
     add(lblName); 

    } 
} 

これはExerciseListの情報を取得するために使用されるエクササイズクラスです。

public class Exercise { 

    private String name; 

    public Exercise(String name) { 
     super(); 
     this.name = name; 

    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

} 

これは私が取得しているエクササイズリストのイメージです。

As you can see, the ExerciseList panels are overlapping, rather than the JScrollPane allowing me to scroll

すべてのヘルプは歓迎です!ありがとう

+2

問題を示している[MCVE]有効を投稿してください。おそらく[Layout manager](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)と 'setBounds() 'の組み合わせに関係しています。しかし、GUIの場合は、['JTable'](https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html)を試してみてください。 – Frakcool

+0

ありがとうございます!私はこのGUIレイアウトにとどまることを好みます。では、問題はレイアウトマネージャとsetbounds()の両方にありますか? –

+0

問題は、それをすることはできないし、そうすべきではないということです。レイアウトやコンポーネントの好みのサイズを自分の実際のサイズに設定してください。さもなければ、あなたが見ているように面白い方法でGUIが表示されます。 –

答えて

3

nullレイアウトを使用しています。レイアウトはJScrollPanesには対応できないため、原則として避けるべきです。これを取り除く:

// setLayout(null); 

あなたの問題は解消されます。なぜこれが問題なのですか?コンテナのレイアウトマネージャとそのコンポーネントは、コンテナとそのコンポーネントの推奨サイズを決定するのに役立ちます。 nullレイアウトが使用されている場合、これは起こらないので、ビューポートのビュー(JScrollPaneによって保持されているJPanel)は、追加のコンポーネントが追加されるときと同じように展開されません。

ヌルレイアウトでsetBounds()が複雑なGUIを作成する最も簡単で最良の方法のように思えるかもしれませんが、より多くのSwing GUIを使用すると、それらを使用するときに遭遇するより深刻な問題が生じます。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。

レイアウトマネージャを学びます。

次に使用してください。例えば

:早いほど良いヘルプについて

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class ExerciseDemo extends JPanel { 
    private static final int PREF_W = 500; 
    private static final int PREF_H = 450; 
    protected static final int MAX_COUNTER = 30; 
    private JPanel exerciseHolder = new JPanel(new GridLayout(0, 1)); 

    public ExerciseDemo() { 
     JPanel wrapperPanel = new JPanel(new BorderLayout()); 
     wrapperPanel.add(exerciseHolder, BorderLayout.PAGE_START); 
     JScrollPane scrollPane = new JScrollPane(wrapperPanel); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     setLayout(new BorderLayout()); 
     add(scrollPane); 

     new Timer(300, new ActionListener() { 
      int counter = 0; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       counter++; 
       exerciseHolder.add(new ExerciseList2(new Exercise("John Smith " + counter))); 
       exerciseHolder.revalidate(); 
       exerciseHolder.repaint(); 
       if (counter > MAX_COUNTER) { 
        ((Timer) e.getSource()).stop(); 
       } 
      } 
     }).start(); 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     ExerciseDemo mainPanel = new ExerciseDemo(); 

     JFrame frame = new JFrame("ExerciseDemo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

@SuppressWarnings("serial") 
class ExerciseList2 extends JPanel { 
    private static final Font NAME_FONT = new Font("Tahoma", Font.PLAIN, 18); 
    private Exercise exercise; 

    public ExerciseList2(Exercise exercise) { 
     this.exercise = exercise; 

     JLabel lblName = new JLabel(exercise.getName()); 
     lblName.setFont(NAME_FONT); 

     setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); 
     setLayout(new BorderLayout(15, 0)); 
     add(new JCheckBox("Check Box"), BorderLayout.LINE_START); 
     add(lblName, BorderLayout.CENTER); 
     add(new JButton("Button"), BorderLayout.LINE_END); 
    }  

    public Exercise getExercise() { 
     return exercise; 
    } 

} 
+0

うわー、情報ありがとう。私はもっ​​と多くのGUIを行うので、これを覚えておきます。どうもありがとう! –

+0

@ gary.l:たとえば、上記のコードをコンパイルして実行します。エクササイズクラスが必要です。 –

+0

非常に印象的な、ホバークラフトありがとう! –

関連する問題