2013-07-31 1 views
0

GUI가 스크롤 창과 함께 있습니다. 스크롤 창은 JPanel의 JPanel을 통해 스크롤하고 있습니다. 나는 subJPanels의 목록에 하나 더 추가하고 JFrame을 업데이트 할 수있는 기능을 원합니다.JFrame에 새 요소를 추가하고 표시하는 방법

지금은 배열을 업데이트하고 있지만 JFrame은 업데이트하지 않았습니다.


package SSCCE; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 

public class Add extends JFrame{ 
    private JPanel[] branches; 
    private JPanel pane; //Pane that stores accounts 
    private JScrollPane scroller; 
    private JButton newBranch; 

    public static void main(String[] args) { 
     JFrame frame = new Add(); 
    } 

    public Add(){ 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(500, 500); 
     this.setTitle("How Do I add?"); 

     this.setLayout(new BorderLayout()); 

     this.add(statusBar(), BorderLayout.NORTH); 

     populateBranches(); 

     pane = new JPanel(); 
     pane.setLayout(new GridLayout(branches.length,1)); 
     for (int i = 0; i < branches.length; i++){ 
      pane.add(branches[i]); 
     } 

     scroller = new JScrollPane(pane); 
     scroller.createVerticalScrollBar(); 
     this.add(scroller,BorderLayout.CENTER); 

     this.setVisible(true); 
    } 

    private JPanel statusBar(){ 
     JPanel statusBar = new JPanel(); 
     statusBar.setLayout(new FlowLayout()); 

     newBranch = new JButton("New Branch"); 
       newBranch.addActionListener(new ButtonEventHandler()); 

     statusBar.add(newBranch); 
     return statusBar; 
    } 

    private void populateBranches(){ 
     branches = new JPanel[2]; 

     for (int i = 0; i < branches.length; i++){ 
      branches[i] = new JPanel(); 
      branches[i].setLayout(new FlowLayout()); 
      branches[i].add(new JTextField(20)); 
     } 
    } 

    private void newBranch(){ 
     JPanel[] tempBranches = new JPanel[branches.length + 1]; 
       System.out.println(tempBranches.length); 

     for (int i = 0; i < branches.length; i++){ 
      tempBranches[i] = branches[i]; 
     } 

     tempBranches[branches.length] = new JPanel(); 
     tempBranches[branches.length].setLayout(new FlowLayout()); 
     tempBranches[branches.length].add(new JTextField(20)); 
     branches = tempBranches; 

     pane = new JPanel(); 
     pane.setLayout(new GridLayout(branches.length, 1)); 
     for (int i = 0; i < branches.length; i++){ 
      pane.add(branches[i]); 
     } 
       pane.repaint(); 
       pane.validate(); 

     scroller = new JScrollPane(pane); 
     this.add(scroller, BorderLayout.CENTER); 

     this.repaint(); 
     this.validate(); 
    } 

    private class ButtonEventHandler implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      String btnClkd = event.getActionCommand(); 
      if (btnClkd.equals("New Branch")){ 
       newBranch(); 
      } 
     } 
    } 
} 
+0

'하는 JButton newBranch'이없는'추가로 ButtonEventHandler''에 대한 액세스를 ActionListener' 'JButton newBranch'와 같거나 틀린데'this '를 제거하고'JFrame {extends,'JButton newBranch'처럼'JFrame'을 만듭니다. – mKorbel

+1

this.add (scroller, BorderLayout.CENTER); & this.repaint(); & this.validate(); 수 myFrame.Xxx – mKorbel

+0

this.setLayout (new BorderLayout()); JFrame API에서 BorderLayout을 사용하면이 코드는 쓸모가 없지만 BorderLayout은 런타임에 컴포넌트를 추가하기위한 LayoutManager가 적합하지 않습니다. 하나의 JCOmponent 만 다섯 번째 영역 중 하나에 배치 될 수 있기 때문에 – mKorbel

답변

1

당신은 GridLayout과, 당신은 단순히 더 많은 구성 요소를 추가 할 수 있습니다 성장하는 것을 허용하는 경우 :

// 0 means new rows are added as needed 
pane.setLayout(new GridLayout(0, 1)); 

// ... 

private void newBranch(){ 
    // Create the component 
    JPanel branch = new JPanel(); 
    branch.add(new JTextField(20)); 
    // + any additional subcomponents 

    // and just add it where the others already are 
    pane.add(branch); 
    pane.revalidate(); 
} 
+0

완벽. 그게 바로 내가 뭘 찾고 있었는지, 고마워! – Kryptos

+0

@Kryptos 안녕하세요. – kiheru