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();
}
}
}
}
'하는 JButton newBranch'이없는'추가로 ButtonEventHandler''에 대한 액세스를 ActionListener' 'JButton newBranch'와 같거나 틀린데'this '를 제거하고'JFrame {extends,'JButton newBranch'처럼'JFrame'을 만듭니다. – mKorbel
this.add (scroller, BorderLayout.CENTER); & this.repaint(); & this.validate(); 수 myFrame.Xxx – mKorbel
this.setLayout (new BorderLayout()); JFrame API에서 BorderLayout을 사용하면이 코드는 쓸모가 없지만 BorderLayout은 런타임에 컴포넌트를 추가하기위한 LayoutManager가 적합하지 않습니다. 하나의 JCOmponent 만 다섯 번째 영역 중 하나에 배치 될 수 있기 때문에 – mKorbel