2014-11-17 2 views
0

스윙 응용 프로그램을 개발 중입니다. 그것에서 JFrameJTextfieldJButton을 동적으로 버튼 click.and에 추가하고 사용자가 동일한 버튼을 클릭하면 생성 된 구성 요소를 제거합니다.스윙 프레임에서 버튼을 동적으로 추가 및 제거

아래의 화면 이미지에서 추가 버튼을 클릭하면 새 행이 추가되고 두 ​​번째 이미지와 같이 텍스트가 REMOVE로 변경되었습니다.

enter image description here

는 새 행 추가 및 이전 단추 텍스트 제거로 변경되었습니다. 내가 제거 버튼을 클릭하면

enter image description here

지금, 다음, 새로 추가 된 행은 폐기해야 다음 버튼을 추가하려면 텍스트를 다시 변경할 수 있습니다.

구성 요소를 추가 할 때까지 시도했지만 새로 추가 된 행을 제거하는 작업에 착수했습니다.

누구나이 목표를 달성하도록 안내해주십시오.

아래 코드는 제 코드입니다.

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JRootPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ButtonAddDynamic implements ActionListener { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new ButtonAddDynamic().createAndShowGUI(); 
     } 
    }); 
} 

private JFrame frame; 
private JPanel panel = new JPanel(new GridBagLayout()); 
private GridBagConstraints constraints = new GridBagConstraints(); 

private List fields = new ArrayList(); 
private List fieldButton = new ArrayList(); 
private List fieldFile = new ArrayList(); 

private static int countReport = 0; 
String files = null; 
int y = 2; 

protected void createAndShowGUI() { 
    try { 
     UIManager 
       .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } 

    String[] labels = { "VALIDATION FORM" }; 
    for (String label : labels) 
     addColumn(label); 

    frame = new JFrame("Add Button Dynamically"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(new JScrollPane(panel)); 
    frame.setLocationRelativeTo(null); 
    frame.setResizable(false); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    // Set the default button to button1, so that when return is hit, it 
    // will hit the button1 

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent we) { 
      System.exit(0); 
     } 
    }); 
} 

private void addColumn(String labelText) { 
    constraints.gridx = fields.size(); 
    constraints.gridy = 1; 
    panel.add(new JLabel(labelText), constraints); 
    constraints.gridy = 2; 
    final JTextField field = new JTextField(40); 
    field.setEditable(false); 
    panel.add(field, constraints); 
    fields.add(field); 

    // constraints.gridy=3; 
    constraints.gridx = fields.size() + fieldButton.size(); 
    final JButton button = new JButton("ADD"); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 

      if (button.getText().equals("ADD")) { 
       button.setText("REMOVE"); 
       addRowBelow(); 
       frame.pack(); 
      } else if (button.getText().equals("REMOVE")) { 
       button.setText("ADD"); 

       frame.pack(); 
      } 

     } 
    }); 
    panel.add(button, constraints); 
    fieldButton.add(button); 
    panel.revalidate(); // redo layout for extra column 
} 

private void addRowBelow() { 
    y++; 
    constraints.gridy = y; 

    // System.out.println(fields.size()); 
    for (int x = 0; x < fields.size(); x++) { 
     constraints.gridx = x; 
     final JTextField field = new JTextField(40); 
     field.setEditable(false); 
     panel.add(field, constraints); 
     constraints.gridx = x + 1; 
     final JButton button = new JButton("ADD"); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       if (button.getText().equals("ADD")) { 
        button.setText("REMOVE"); 
        addRowBelow(); 
        frame.pack(); 
       } else if (button.getText().equals("REMOVE")) { 
        button.setText("ADD"); 

        frame.pack(); 
       } 
      } 
     }); 
     panel.add(button, constraints); 
    } 
} 

public void actionPerformed(ActionEvent ae) { 
    if ("Add Another TextField and Button".equals(ae.getActionCommand())) { 
     addRowBelow(); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
    } 
} 
} 
+0

정말로 제거 하시겠습니까, 아니면 회색으로 표시되도록 "권한 취소"하시겠습니까? 그렇게 쉬지 않니? – ha9u63ar

+0

레이블을 동적으로 추가하는 작업 예제는 [이 답변] (http://stackoverflow.com/a/5630271/418556)을 참조하십시오. –

+2

BTW -'Delete Selected '버튼과 함께'JList'를 사용하는 것도 고려하십시오. 훨씬 더 간단합니다. –

답변

3

GridBagLayout을 사용하는 것은 매우 복잡한 작업입니다. 중첩 된 레이아웃 구성표는이 유형의 작업을 수행 할 때 훨씬 쉽게 작업 할 수 있습니다.

이 MCVE 참조 :

field listing

내가 의도 한 기능을 100 % 정확한 이해 모르겠어요를하지만 난 그게 레이아웃만큼 중요하다고 생각하지 않습니다. 다음과 같이

내 배치 방식은 다음과 같습니다 BoxLayout에서는 훨씬 와글 와글없이 수직 목록을 처리 할 수 ​​있기 때문에

layout scheme

이 좋다. GridBagConstraints와 논쟁하는 대신, 텍스트 필드와 버튼은 패널에 의해 함께 포함됩니다.

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Insets; 

public class FieldList implements Runnable, ActionListener { 
    public static void main(String... args) { 
     SwingUtilities.invokeLater(new FieldList()); 
    } 

    final int maxFields = 2; 

    JFrame frame; 
    JPanel listing; 

    @Override 
    public void run() { 
     frame = new JFrame("Text Field Listing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel content = new JPanel(new BorderLayout()); 
     content.add(new JLabel("Input Form", JLabel.CENTER), BorderLayout.NORTH); 

     listing = new JPanel(); 
     listing.setLayout(new BoxLayout(listing, BoxLayout.Y_AXIS)); 

     content.add(listing, BorderLayout.CENTER); 
     frame.setContentPane(content); 

     addNewField(); 

     frame.pack(); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    void addNewField() { 
     FieldButtonPair field = new FieldButtonPair(); 
     field.button.addActionListener(this); 
     listing.add(field); 
     frame.pack(); 
    } 

    void removeLastField() { 
     listing.remove(listing.getComponentCount() - 1); 
     frame.pack(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     AddRemoveButton source = (AddRemoveButton)ae.getSource(); 

     if(source.state == AddRemoveButton.State.ADD) { 
      if(listing.getComponentCount() < maxFields) { 
       addNewField(); 
       source.setState(AddRemoveButton.State.REMOVE); 
      } 
     } else if(source.state == AddRemoveButton.State.REMOVE) { 
      removeLastField(); 
      source.setState(AddRemoveButton.State.ADD); 
     } 
    } 
} 

class FieldButtonPair extends JPanel { 
    JTextField field; 
    AddRemoveButton button; 

    FieldButtonPair() { 
     super(new BorderLayout()); 
     field = new JTextField(); 
     add(field, BorderLayout.CENTER); 
     button = new AddRemoveButton(); 
     add(button, BorderLayout.EAST); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension pref = super.getPreferredSize(); 
     pref.width = Math.max(480, pref.width); 
     return pref; 
    } 
} 

class AddRemoveButton extends JButton { 
    enum State { ADD, REMOVE } 

    State state = State.ADD; 

    AddRemoveButton() { 
     setText(state.name()); 
    } 

    void setState(State state) { 
     setText(state.name()); 
     this.state = state; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension pref = super.getPreferredSize(); 

     Font f = getFont(); 
     FontMetrics fm = getFontMetrics(f); 
     int w = fm.stringWidth(State.REMOVE.name()); 
     Insets ins = getInsets(); 

     pref.width = (ins.left + w + ins.right); 
     return pref; 
    } 
} 
+0

잘 작동하는 @ 라디 오데 후프와 당신은 내 의구심을 해소했습니다. 제안과 시간에 감사드립니다. – CarlJohn

관련 문제