2014-05-19 7 views
0

이 코드는 이미 한 번 게시 된 Delete check-boxes in swings이며 그 답이 있습니다. 그러나 곧 프로젝트 요구 사항이 변경되어 코드를 변경하기로 결정했습니다. 목록에서 값을 직접 삭제하려고하는 대신 색인을 삭제합니다.값을 사용하여 스윙에서 chekbox 삭제

이 과정에서 문제가 하나 있습니다. 즉, 한 번에 하나씩 확인란을 삭제하면 삭제하지 않지만 한 번에 하나 이상의 확인란을 삭제하려고하면 삭제하지 않습니다. 아니 내가 붙어있어.

여기 내 코드입니다.

import java.awt.*; 
import java.util.List; 
import java.awt.event.*; 
import java.util.*; 

import javax.swing.*; 
import javax.swing.border.TitledBorder; 

@SuppressWarnings("serial") 
public class DeleteMapSheets extends JDialog { 

    private JList list; 
    private JPanel rightPanel; 

    TitledBorder title; 

    // Adding for progress bar 
    JDialog dailog = new JDialog(); 
    JPanel jContentPa; 
    JProgressBar jProgressBar; 

    // Add radio buttons 
    private final static JRadioButton vector = new JRadioButton("Vector", true); 
    private final static JRadioButton raster = new JRadioButton("Raster"); 
    private final static JRadioButton elevator = new JRadioButton("Elevator"); 
    private static ButtonGroup buttonGroup = new ButtonGroup(); 
    private static Object dialog; 
    JButton cancel = new JButton("Cancel"); 
    JButton delbtn = new JButton("Delete"); 

    List<Integer> indexVal = new ArrayList<Integer>(); 

    public DeleteMapSheets() { 
    } 

    public DeleteMapSheets(List<String> vectorMap, List<String> elevatorMap, 
      List<String> rastorMap) { 

     createList(createData(vectorMap)); 
     createElevator(createData(elevatorMap)); 
     createRastor(createData(rastorMap)); 
     createButtons(); 
     initUI(); 
    } 

    private void createList(final List<CheckListItem> mappedList) { 

     vector.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent event) { 

       checklistModel mModel = (checklistModel) list.getModel(); 
       if (event.getStateChange() == 1) { 
        mModel.setItems(mappedList); 
        list.validate(); 
        list.repaint(); 
       } 
      } 
     }); 

     checklistModel gChecklist = new checklistModel(mappedList); 
     list = new JList(gChecklist); 

     // list.setModel(mModel); 
     list.setCellRenderer(new CheckListRenderer()); 

     list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
     list.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent event) { 

       if (event.getClickCount() == 1) { 

        CheckListItem checkValue = (CheckListItem) list 
          .getSelectedValue(); 

        if (checkValue != null) { 
         checkValue.setSelected(!checkValue.isSelected()); 
         list.validate(); 
         list.repaint(list.getBounds()); 

        } 
       } 
      } 
     }); 

    } 

    // Default 
    private List<CheckListItem> createData(List<String> list2) { 

     int n = list2.size(); 

     List<CheckListItem> items = new ArrayList<DeleteMapSheets.CheckListItem>(); 
     for (int i = 0; i < n; i++) { 
      items.add(new CheckListItem(list2.get(i))); 
     } 
     return items; 
    } 

    // Elevator 
    private List<String> createElevator(final List<CheckListItem> list2) { 
     elevator.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent event) { 

       if (event.getStateChange() == 1) { 
        checklistModel mModel = (checklistModel) list.getModel(); 
        mModel.setItems(list2); 
        list.validate(); 
        list.repaint(); 
       } 
      } 

     }); 
     return null; 
    } 

    // Create Vector 
    private List<String> createRastor(final List<CheckListItem> list2) { 

     raster.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent event) { 

       if (event.getStateChange() == 1) { 
        checklistModel mModel = (checklistModel) list.getModel(); 
        mModel.setItems(list2); 
        list.validate(); 
        list.repaint(); 
       } 
      } 
     }); 

     return null; 
    } 

    private void createButtons() { 

     rightPanel = new JPanel(); 
     cancel.setMaximumSize(cancel.getMaximumSize()); 
     delbtn.setMaximumSize(cancel.getMaximumSize()); 

     // Cancel button taking the action 
     cancel.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       System.exit(0); 
      } 
     }); 

     // Cancel 
     delbtn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 

       /*I am facing the problem here after i checked i am getting only one value */    

       final int dialogButton = JOptionPane.YES_NO_OPTION; 
       final int dialogResult = JOptionPane.showConfirmDialog(null, 
         "Are you sure you want to delete the selected map", 
         "Delete", dialogButton); 

       SwingWorker<?, ?> worker = new SwingWorker<Void, Integer>() { 
        protected Void doInBackground() throws InterruptedException { 
         checklistModel mModel = (checklistModel) list 
           .getModel(); 
         if (dialogResult == JOptionPane.YES_OPTION) { 

          for (CheckListItem items : mModel.items) { 
           if (items.isSelected) { 
            mModel.removeAt(items); 
           } 

          } 
         } 

         return null; 
        } 

        protected void done() { 
         //RefreshProgressDailog.dispose(); 
        } 
       }; 
       if (dialogResult == 0) { 
        worker.execute(); 
        //RefreshProgressDailog.setVisible(true); 
       } 

      } 

     }); 

     rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.LINE_AXIS)); 
     rightPanel.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4)); 
     rightPanel.add(Box.createHorizontalStrut(60)); 
     rightPanel.add(delbtn); 
     rightPanel.add(Box.createRigidArea(new Dimension(10, 0))); 
     rightPanel.add(cancel); 
    } 

    private void initUI() { 

     // JScroll Panel 
     JScrollPane listScroller = new JScrollPane(list); 
     listScroller.setPreferredSize(new Dimension(250, 80)); 
     // listScroller.setAlignmentX(LEFT_ALIGNMENT); 

     // Lay out the label and scroll pane from top to bottom. 
     JPanel listPane = new JPanel(); 
     listPane.setLayout(new BoxLayout(listPane, BoxLayout.Y_AXIS)); 

     // Add all to the panel 
     listPane.add(Box.createRigidArea(new Dimension(0, 2))); 
     // listPane.add(listScroller); 
     listPane.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10)); 

     // Lay out the buttons from left to right. 
     JPanel buttonPane = new JPanel(); 
     buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); 
     buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); 
     buttonPane.add(Box.createHorizontalStrut(60)); 
     buttonPane.add(delbtn); 
     buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); 
     buttonPane.add(cancel); 

     JPanel radioPanel = new JPanel(); 
     radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.LINE_AXIS)); 

     title = BorderFactory.createTitledBorder("Types Of Data"); 

     // Add the radio buttons 
     buttonGroup.add(vector); 
     buttonGroup.add(raster); 
     buttonGroup.add(elevator); 
     radioPanel.setAlignmentX(Component.CENTER_ALIGNMENT); 
     radioPanel.add(vector); 
     radioPanel.add(raster); 
     radioPanel.add(elevator); 

     radioPanel.setBorder(title); 

     listPane.add(buttonPane); 
     listPane.add(radioPanel); 
     listPane.add(listScroller); 
     // listPane.add(setButton); 

     // Put everything together, using the content pane's BorderLayout. 
     Container contentPane = getContentPane(); 
     contentPane.add(listPane, BorderLayout.CENTER); 
     contentPane.add(buttonPane, BorderLayout.PAGE_END); 
     add(listPane); 

     add(listPane); 

     setTitle("Delete Map"); 
     setSize(300, 350); 
     setLocationRelativeTo(null); 

    } 

    class CheckListItem { 
     private String label; 
     private boolean isSelected = false; 

     public CheckListItem(String string) { 
      this.label = string; 
     } 

     public boolean isSelected() { 
      return isSelected; 
     } 

     public void setSelected(boolean isSelected) { 
      this.isSelected = isSelected; 
     } 

     public String toString() { 
      return label; 
     } 
    } 


    class CheckListRenderer extends JCheckBox implements ListCellRenderer { 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean hasFocus) { 
      setEnabled(list.isEnabled()); 
      setSelected(((CheckListItem) value).isSelected()); 
      // System.out.println("i am checked "+((CheckListItem) 
      // value).isSelected()); 
      setFont(list.getFont()); 
      setBackground(list.getBackground()); 
      setForeground(list.getForeground()); 
      setText(value.toString()); 
      return this; 
     } 

    } 

    class checklistModel extends AbstractListModel { 

     private List<CheckListItem> items; 

     public checklistModel(List<CheckListItem> list) { 
      super(); 
      this.items = list; 
     } 

     public void setItems(List<CheckListItem> createData) { 

      this.items = createData; 
      fireContentsChanged(this, items.size() - 1, items.size()); 
     } 

     public void setChecklistItems(List<CheckListItem> item2) { 
      this.items = new ArrayList<DeleteMapSheets.CheckListItem>(); 
      for (CheckListItem item : item2) { 
       this.items.add(item); 
      } 
     } 

     public void add(CheckListItem item) { 
      items.add(item); 
     } 

     public CheckListItem getElement(CheckListItem items) { 
      return items; 
     } 

     @Override 
     public CheckListItem getElementAt(int index) { 
      if (index != -1 || index > 0) { 
       return items.get(index); 
      } 
      return null; 
     } 

     @Override 
     protected void fireIntervalRemoved(Object Source, int index0, int index1) { 
      super.fireIntervalRemoved(Source, index0, index1); 
     } 

     @Override 
     public int getSize() { 
      return items.size(); 
     } 

     public void removeAt(CheckListItem item) { 
      items.remove(item); 
      fireIntervalRemoved(this, items.size(), items.size()); 
     } 

    } 

    public static void main(String[] args) throws ClassNotFoundException, 
      InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
      SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       List<String> vectorMap = new ArrayList<String>(); 

       vectorMap.add("20"); 
       vectorMap.add("21"); 
       vectorMap.add("22"); 
       vectorMap.add("23"); 
       vectorMap.add("24"); 
       vectorMap.add("25"); 
       vectorMap.add("26"); 
       vectorMap.add("27"); 
       vectorMap.add("28"); 

       List<String> elevatorMap = new ArrayList<String>(); 

       elevatorMap.add("0elevator"); 
       elevatorMap.add("1elevator"); 
       elevatorMap.add("2elevator"); 
       elevatorMap.add("3elevator"); 
       elevatorMap.add("4elevator"); 
       elevatorMap.add("5elevator"); 
       elevatorMap.add("6elevator"); 
       elevatorMap.add("7elevator"); 

       List<String> rastorMap = new ArrayList<String>(); 

       rastorMap.add("0r"); 
       rastorMap.add("1r"); 
       rastorMap.add("2r"); 
       rastorMap.add("3r"); 
       rastorMap.add("4r"); 
       rastorMap.add("5r"); 
       rastorMap.add("6r"); 
       rastorMap.add("7r"); 

       DeleteMapSheets ex = new DeleteMapSheets(vectorMap, 
         elevatorMap, rastorMap); 

       ex.setVisible(true); 
      } 
     }); 
    } 

} 
+0

SOPC에 567 LOC를 덤프 해 주셔서 감사합니다. 아니 .. 기다려, 다른 건. 더 나은 도움을 더 빨리 얻으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소한의 완전하고 검증 가능한 예)를 게시하십시오. –

+0

늦게 답장을 드려 죄송합니다. 나는 편집하고 내가 어디에 문제를 직면하고 있는지 보여 주었다.하지만 편집 만 가능하다. 코드를 실행할 때 문제가 발생하지 않기 때문에 전체 코드를 게시했습니다. – rakeshhatwar

+0

* "코드를 실행할 때 문제가 발생하지 않아야합니다."* 아무도 당신을 도울 수 없습니다. 런타임 문제를 쉽게 파악할 수있는 점은 자신이 볼 수있는 것이 더 쉬울수록 도움을받을 기회가 많아진다는 것입니다. 코드는 여전히 486 행입니다. 캐주얼 한 글에서 아직 많은 관련성이없는 코드가있는 것으로 보입니다. –

답변

1

이 코드를 사용해보십시오. 인라인 코멘트를 읽으십시오.

if (dialogResult == JOptionPane.YES_OPTION) { 
    // First collect all the selected CheckListItem 
    List<CheckListItem> removed = new ArrayList<CheckListItem>(); 
    for (CheckListItem item : mModel.items) { 
     if (item.isSelected) { 
      removed.add(item); 
     } 
    } 

    // Finally remove the selected CheckListItem 
    for (CheckListItem item : removed) { 
     mModel.removeAt(item); 
    } 
} 

여기에 문제의 원인이 동일하게 반복하는 동안이 항목을 제거하는 코드이다.

if (dialogResult == JOptionPane.YES_OPTION) { 
    for (CheckListItem items : mModel.items) { // Iterating Items 
     if (items.isSelected) { 
      mModel.removeAt(items);  // REMOVE Item 
     } 
    } 
} 
+0

도움을 주셔서 감사합니다. 예 옵션을 클릭 할 때마다 매번 새로운 배열 목록을 생성한다는 의심을 가지고 있습니다. ** 즉, 새로운 키워드 **를 만들 때마다 성능 문제가 발생하지 않을 것입니다. ** (또는) 그 대안이 있습니다. – rakeshhatwar

+0

성능 문제는 없습니다. 왜 그렇게 생각하니? – Braj

+0

jvm 메모리가 걱정됩니다. 모든 삭제에 대해 그것은 내가 물었던 이유 인 약간의 기억을 가지고있다. – rakeshhatwar