2017-02-24 17 views
0

JscrollPaneに問題があります。いくつかのボタンを連続して追加しようとすると、一連の行が続きますが、最初はうまく表示されますが、スクロールバーをクリックすると、すべてのボタンがフレームに巻き込まれます。私は要素の数に応じて行を拡張/縮小する必要があるので、setBounds(レイアウトなし)を使用したいと考えています。Java、JFC、Swing

私は間違っていますか?

ピックがここに表示されます:https://drive.google.com/drive/u/0/folders/0B-m6SCJULOTRdHZ6cUwxX041SHM

public class JFrameWindow extends JFrame { 
private int num = 0; 
private JPanel container = null; 
private JScrollPane jsp = null; 

public JFrameWindow(String framName) { 
    super(framName); 
    container = new JPanel() { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g.create(); 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      //g2.setPaint(Paint); 
      //g2.fillOval(0, 0, getWidth(), getHeight()); 
      g2.dispose(); 
     } 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(1200, 800); 
     }; 
    }; 
    //container.setLayout(mgr); 

    jsp = new JScrollPane(); 
    jsp.setViewportView(container); 
    jsp.setPreferredSize(new Dimension(1200, 800)); 
    container.setPreferredSize(new Dimension(1200, 800)); 
    //jsp.setBorder(new EtchedBorder(Color.BLACK, Color.GREEN)); 
    //jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    //jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    this.add(jsp); 
    setSize(1200, 800); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true);   
} 

public void addButtons(String id, int a, int b) { 
    JButton button1 = new JButton(id); 
    button1.setBounds(10, num*30 + 10, 100, 20); 
    container.add(button1); 

    JButton stateButton = new JButton("ABC"); 
    stateButton.setBounds(120, num*30 + 10, 100, 20); 
    container.add(stateButton); 

    JButton custButton = new JButton("DEF"); 
    custButton.setBounds(230, num*30 + 10, 100, 20); 
    container.add(custButton); 

    JButton int1Button = new JButton("" + a); 
    int1Button.setBounds(340, num*30 + 10, 100, 20); 
    container.add(int1Button); 

    JButton int2Button = new JButton("" + b); 
    int2Button.setBounds(450, num*30 + 10, 100, 20); 
    container.add(int2Button); 

    num++; 
    container.repaint(); 
    jsp.repaint(); 
    this.repaint(); 
} 

public static void main(String [] args) { 
    JFrameWindow window = new JFrameWindow ("Test"); 
    window.addButtons("Test1", 1, 2); 
    window.addButtons("Test2", 1, 2); 
    window.addButtons("Test3", 1, 2); 
    window.addButtons("Test4", 1, 2); 
    window.addButtons("Test5", 1, 2); 
    window.addButtons("Test6", 1, 2); 
    window.addButtons("Test7", 1, 2); 
    window.addButtons("Test8", 1, 2); 
    window.addButtons("Test9", 1, 2); 
    window.addButtons("Test10", 1, 2); 
    window.addButtons("Test11", 1, 2); 
    window.addButtons("Test12", 1, 2); 
    window.addButtons("Test13", 1, 2); 
    window.addButtons("Test14", 1, 2); 
    window.addButtons("Test15", 1, 2); 
    window.addButtons("Test16", 1, 2); 
    window.addButtons("Test17", 1, 2); 
    window.addButtons("Test18", 1, 2); 
    window.addButtons("Test19", 1, 2); 
    window.addButtons("Test20", 1, 2); 
    window.addButtons("Test21", 1, 2); 
    window.addButtons("Test22", 1, 2); 
    window.addButtons("Test23", 1, 2); 
    window.addButtons("Test24", 1, 2); 
    window.addButtons("Test25", 1, 2); 
    window.addButtons("Test26", 1, 2); 
    window.addButtons("Test27", 1, 2); 
    window.addButtons("Test28", 1, 2); 
    window.addButtons("Test29", 1, 2); 
    window.addButtons("Test30", 1, 2); 
} 

}

+1

ようこそ。あなたのタイトルは何も示唆していません。それはタグの意味です。より具体的な内容で編集してください。 – Mordechai

答えて

2

が、しかし、すぐに私は、スクロールバーをクリックすると、すべてのボタンがフレームに包まれた単語の並べ替えを取得します。

スクロールを開始するとパネルが再確認されます)、レイアウトマネージャが呼び出され、レイアウトマネージャがすべてのコンポーネントのサイズと位置を決定します。 JPanelのデフォルトのレイアウトマネージャーはFlowLayoutであるため、現在の行がいっぱいになるとコンポーネントは新しい行に折り返されます。

setBounds(...)を使用しないでください。代わりに、使用するように設計された方法でレイアウトマネージャを使用することができます。

私は要素の数に応じて行を拡張/縮小する必要があるので、(レイアウトなしで)setBoundsを使用したいと思います。

これは、レイアウトマネージャを使用しない理由ではありません。

たとえば、メインパネルの縦がBoxLayoutの場合があります。次に、コンポーネントの行を追加するたびに、FlowLayoutを使用する子パネルを作成します。コンポーネントを子パネルに追加し、子パネルをメインパネルに追加します。

スクロールバーとスクロールペインが正しく機能します。

container.setPreferredSize(new Dimension(1200, 800)); 

パネルの推奨サイズを制御しないでください。ここでも、レイアウトマネージャの仕事があります。スクロールペインは、人工的に望ましいサイズでは正しく動作しません。