2010-08-21 4 views
4
ArrayList.remove (INT 지수)의 ActionListener 클래스의 익명 인스턴스에 노력하고 있습니다

: -ArrayList.remove (INT 지수) 익명이 아닌 클래스 객체와 함께 작동하지

DeleteModule.java : -

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 



class MyFrame extends JFrame{ 

    private ArrayList<String> list = new ArrayList<String>() ; 
    private JButton btn = new JButton("Enter index to delete : ") ; 
    private JTextField fld = new JTextField() ; 

    MyFrame(){ 
     populateList() ; 

     setLayout(new GridLayout(1, 2)) ; 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ; 
     setSize(400, 60) ; 

     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       list.remove(Integer.parseInt(fld.getText())) ; 
       JOptionPane.showConfirmDialog(null, list, "Total Elements : " + list.size(), JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ; 
      } 
     }); 

     add(btn) ; 
     add(fld) ; 

     setTitle("Total Elements : " + list.size()) ; 

     setVisible(true) ; 
    } 

    private void populateList(){ 
     for(int i = 1 ; i <= 5 ; ++i){ 
      list.add("Key " + i) ; 
     } 
    } 
} 

public class DeleteModule { 

    public static void main(String[] args) { 
     new MyFrame() ; 
    } 
} 

그러나 이것을 원본 모듈과 통합 할 때 (아래에는 DeleteFromPoolListener.class의 비 익명 인스턴스가있는 축소 된 소스 코드가 수정 됨) 삭제를 위해 false가 반환됩니다. 나는 그것이 왜 효과가 없는지 정말로 모른다.

Demo.java

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Vector; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

class MyFrame extends JFrame{ 

    private ArrayList<Pair> list = new ArrayList<Pair>() ; 

    private JButton deleteBtn = new JButton("Delete Pair at index : ") ; 
    private JTextField deleteIndexText = new JTextField() ; 

    MyFrame(){ 
     populateList() ; 
     setTitle("List size : " + list.size()) ; 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ; 

     JPanel lowerPanel = new JPanel() ; 
     lowerPanel.setLayout(new GridLayout(2, 1)) ; 

     deleteBtn.addActionListener(new DeleteFromPoolListener()) ; lowerPanel.add(deleteBtn) ; 
     lowerPanel.add(deleteIndexText) ; 
     add(lowerPanel) ; 
     pack() ; 
     setVisible(true) ; 
    } 

    private void populateList(){ 
     for(int i = 1 ; i <= 5 ; ++i){ 
      list.add(new Pair("Key " + i, "Value " + i)) ; 
     } 
    } 


    class DeleteFromPoolListener implements ActionListener{ 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      Integer i = null ; 
      try{ 
       i = Integer.parseInt(deleteIndexText.getText().trim()) ; 
       boolean b = list.remove(i) ; 

       JOptionPane.showConfirmDialog(null, list + "\n\n" + "Deleted : " + b + " from index " + i, "List size : " + list.size(), JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ; 
       setTitle("Total Pairs : " + list.size()) ; 
       deleteIndexText.setText("") ; 
      } 
      catch(NumberFormatException nfe){ 
       JOptionPane.showConfirmDialog(null, "Enter numeric value in range.", "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ; 
       deleteIndexText.setText("") ; 
      }  
     } 
    } 
} 



public class Demo { 

    public static void main(String[] args) { 
     new MyFrame() ; 
    } 
} 

class Pair{ 

    private String key ; 
    private String value ; 

    Pair(String k, String v){ 
     key = k ; 
     value = v ; 
    } 

    public String toString() { 
     return "[" + value + "]" ; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

나는 그것이 작동하지 않는 이유를 정말 혼란 스러워요 ... :(

+0

okz, 내 바보 같은 실수, thnx 톤 guyz을 인정합니다 ... m이 게시물에 표시 대답 : :) – mogli

답변

9

에없는 :

은 간단하게이 하나의 코드를 교체 데모.자바 당신은 사용해야

boolean b = (list.remove(i.intValue()) != null) 

대신 그 이유는 다음과 같다

boolean b = list.remove(i) ; 

의. ArrayList에는 두 개의 제거 함수가 있습니다. 하나는 매개 변수로 int (정수가 아님)를 취하는 함수와 하나는 Object로 매개 변수를 취하는 함수입니다.

첫 번째 예에서는 첫 번째 제거 (intValue()를 사용하여 int로 변환)를 사용했습니다. 두 번째로 Integer가 나타내는 Object를 제거하려고했습니다 (컬렉션에는 없었 음).

6

ArrayList 클래스는 두 remove 방법이 있습니다

  • One을 Object 소요 목록에서 해당 개체를 제거하려고 시도하면
  • int 색인을 생성하고 해당 색인에있는 목록의 객체를 제거합니다.

변수 iInteger으로 선언 했으므로 Object입니다. 따라서 remove(Object) 메소드가 호출됩니다. 목록에 Pair이 있고 Integer 초가 아니기 때문에 i을 삭제하려고 시도하면 아무런 변화가 없습니다.

는 당신이 필요가있는 무엇을 선언하는 것입니다 변수 iint로, 그것을 0의 기본값 (당신이 intnull를 할당 할 수 없습니다), 그리고 줄을 변경을 제공

boolean b = list.remove(i) ; 

에 그것은 아무것도 제거 여부를 나타내는

boolean b = (list.remove(i) != null) ; 

remove(int) 때문에 개체가 목록에서 제거 반환, 대신 boolean .

+0

22 초 너무 늦었 어 :) –

1

list.remove(int) 대신 list.remove(Object)을 호출하기 때문에 문제가 발생합니다. i은 기본 유형이 아니고 Integer (또는 Object)이므로 JVM은 실제 인덱스가 아닌 객체를 제거하려고한다고 생각합니다. 목록에 Integer 개체가 없으므로 false를 반환합니다.

int i; 
try{ 
    i = Integer.parseInt(deleteIndexText.getText().trim()) ; 
    boolean b = (list.remove(i) != null); 

    JOptionPane.showConfirmDialog(null, list + "\n\n" + "Deleted : " + b + " from index " + i, "List size : " + list.size(), JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ; 
    setTitle("Total Pairs : " + list.size()) ; 
    deleteIndexText.setText("") ; 
} 
catch(NumberFormatException nfe){ 
    JOptionPane.showConfirmDialog(null, "Enter numeric value in range.", "Error", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE) ; 
    deleteIndexText.setText("") ; 
}  

예, 자바

Integer i = 2, j = new Integer(10); 
i = i + j; 
System.out.println(i.toString()); 

이 잘 peform받는 수 있지만, intInteger 같은 유형 :

관련 문제