2013-11-01 12 views
0

나는 자바 스윙을 처음 사용합니다. 확인란을 생성하는 코드가 있습니다. 클릭 할 때 선택한 체크 박스 항목을 삭제해야하는 프레임의 어딘가에 버튼이 있어야합니다. 여기까지 내가 지금까지 가지고있는 것이있다.자바 스윙을 사용하여 선택된 체크 박스 삭제하기

public class Scroll extends JPanel { 


public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run() { 
      createAndShowGUI(); 
      } 
     }); 
    } 
public static void createAndShowGUI()  { 
    JFrame frame = new JFrame("JFrame with ScrollBar"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JComponent newContentPane = new ResultButtonBar(); 
    newContentPane.setOpaque(true); 
    JScrollPane scrollPane = new JScrollPane(newContentPane); 
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    frame.getContentPane().add(scrollPane); 
    frame.setSize(800, 800); 
    frame.setVisible(true); 
    JButton startButton = new JButton("Start"); 
    frame.add(startButton, BorderLayout.SOUTH); 
    startButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 

      JOptionPane.showMessageDialog(null, "basdsadad"); 

       } 
     }); 

    } 

    } 

새로운 ResultButtonBar(). 자바 모든

public class ResultButtonBar extends JPanel { 

    private HashMap<JCheckBox, ArrayList<Integer>> map = new HashMap<>(); 
    private JLabel _label; 

    private static final int MAX_CHECKS = 1000; 

    public ResultButtonBar() { 
     super(); 

     JButton btn = new JButton(); 
     btn.setVisible(true); 

     JCheckBox checkBox; 
     Random r = new Random(); 

     JPanel checkPanel = new JPanel(new GridLayout(0, 1)); 
     _label = new JLabel("You selected nothing"); 
     checkPanel.add(_label); 

     for (int i = 0; i < MAX_CHECKS; i++) { 
      StringBuilder sb = new StringBuilder(); 
      ArrayList<Integer> a = new ArrayList<>(); 
      for (int j = 0; j < 2; j++) { 
       Integer temp = (r.nextInt()) % 100; 
       a.add(temp); 
       sb.append(temp).append(" "); 
      } 

      checkBox = new JCheckBox(sb.toString().trim()); 
      checkBox.setName("CheckBox" + i); 

      map.put(checkBox, a); 
      checkPanel.add(checkBox); 
     } 

     add(checkPanel); 

    } 

} 
+0

이 getComponents()를 사용합니다. 각 체크에 대해 JCheckbox의 인스턴스인지 여부와 그것이 선택된 경우 제거하십시오.{ \t \t \t \t // TODO 자동 생성 방법 스터브 \t \t \t \t \t \t \t \t \t 부품 체크 박스 [] = 용 checkPane.getComponents (\t 공개 무효의 actionPerformed (의 ActionEvent는 arg0)를 다음과 같이 – StanislavL

답변

2

첫째, 당신이 그것을 필요로 할 때 그래서 당신이 그들에 대한 참조를 가질 것이다 ArrayList에서 모든 확인란을 유지한다.

그런 다음 필요에 따라 JButton을 추가하십시오. 그런 다음 ArrayList을 반복하고 확인란이 들어있는 구성 요소에서 invalidate()으로 전화하십시오. 다음 문장은 컨테이너에서 remove() 메서드를 호출하는 것입니다. checkPanel.

또는 컨테이너의 모든 구성 요소에 확인란이 있고이를 제거하려는 경우 removeAll()으로 전화 할 수 있습니다. 당신이 체크 박스와 함께 다른 구성 요소의 많은 경우 StanislavL 가리키는

대안도 좋은 하나입니다

나는 두 가지 방법을 생각할 수
1

: 당신은 유지하는 경우

  • 하나의 JPanel 인스턴스에만 JCheckBox의 인스턴스가 포함 된 경우 먼저 panel.getComponents() 메서드를 사용하여 모든 확인란을 가져올 수 있으며 선택 상태를 확인하고 상태에 따라 panel.remove(component)을 호출하여 해당 인스턴스를 제거 할 수 있습니다. 예를 들면 다음과 같습니다 checkBoxPanel

    Component checkBox[] = checkBoxPanel.getComponents(); 
    for(Component c:checkBox) 
        if(((JCheckBox)c).isSelected()) 
        checkBoxPanel.remove(c); 
    checkBoxPanel.revalidate(); 
    checkBoxPanel.repaint(); 
    

    마지막 호출 revalidate()repaint()는 구성 요소의 레이아웃과 그래픽 렌더링에 변화를 반영하는 것이 중요합니다.

  • JCheckBox의 인스턴스와 함께 ItemListener을 사용하면 선택 상태가 변경 될 수 있습니다. ArrayList<JCheckBox>의 인스턴스를 사용하여 selected checkBox을 목록에 추가하십시오. 그러나 구현 된 ItemListener : MyItemListener implements ItemListener을 사용하고 하나의 인스턴스를 생성하고이 인스턴스를 모든 checkboxes에 추가하여 상태 변경에 대응해야합니다. 이벤트 소스 e.getSource()을 사용하여 ItemEvent이 수행되는 JCheckBox 인스턴스를 가져올 수 있습니다.

튜토리얼 리소스 다음 checkPanel에서

  1. How to Write an Item Listener
+0

가 나는의 actionListener 방법 업데이트); (C 성분 : 체크 박스) 용 \t \t \t \t \t { \t \t \t 경우 (((JCheckBox에) c) .isSelected()) { \t \t \t \t checkPane.remove (c); \t \t \t \t checkPane.validate(); // \t \t \t \t JOptionPane.showMessageDialog (null, "basdsadad"); \t \t \t \t \t} \t \t \t \t \t \t }} \t \t \t \t}); 그러나 NullPointerException을 반환하고 있습니다. –

+0

@user2945142, 작성한 코드가 잘 이해되지 않았지만'checkPane '이 초기화되었는지 확인하십시오. 나는 당신이 실수로'checkPanel' 대신에'checkPane'을 사용하고 있다고 생각하거나 당신이 checkBox를'chekPanel'에 전혀 추가하지 않았다고 생각합니다. 확인해주세요. – Sage