2013-01-20 4 views
3

구성 요소를 작성했으며 구성 요소를 사용자 정의하려면 ActionListener을 추가하려고합니다.
JButton과 같은 구성 요소를 만들고 EventsactionPerformed 이벤트를 표시하고 디자인보기에서 대화 상자를 표시하려고합니다.ActionListener를 추가하여 구성 요소를 사용자 정의하는 방법

JBaseComponent 클래스는 JComponent에서 파생됩니다.

코드 :

public class JCButton extends JBaseComponent implements ActionListener,ItemSelectable,ChangeListener{ 

private JButton _button=new JButton(); 
private ActionEvent _actevent=new ActionEvent(this,ActionEvent.ACTION_PERFORMED,""); 

public JCButton() { 
    super(); 
    _button.setPreferredSize(new Dimension(105, 25)); 
    _button.setFocusTraversalKeysEnabled(false); 

    _button.addMouseListener(new MouseAdapter() { 

     public void mousePressed(MouseEvent e) { 
      JComponent c = (JComponent) e.getSource(); 
      TransferHandler handler = c.getTransferHandler(); 
      handler.exportAsDrag(c, e, TransferHandler.COPY); 
     } 
    }); 

    _button.setTransferHandler(new TransferHandler("btn")); 

    setColorFocus(false); 

    _button.addActionListener(this); 
    actionPerformed(_actevent); 
    addActionListener(this); 
    revalidate(); 
    repaint(); 
    add(_button); 
} 

public void setText(String txt){ 
    _button.setText(txt); 
} 

public void setIcon(Icon ico){ 
    _button.setIcon(ico); 
} 

public void addActionListener(ActionListener act){ 
    _button.addActionListener(act); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
} 

@Override 
public Object[] getSelectedObjects() { 
    return null; 
} 

@Override 
public void addItemListener(ItemListener l) { 

} 

@Override 
public void removeItemListener(ItemListener l) { 

} 

@Override 
public void stateChanged(ChangeEvent e) { 

} 
} 

답변

1

다음 최선의 선택은 EventListenerList 배관이 here 언급이 포함 AbstractButton을 확장하고, 당신이 정말로이에 대한 JButton을 사용할 수 없습니다 합니다. 예를 들어,

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.AbstractButton; 
import javax.swing.Action; 
import javax.swing.DefaultButtonModel; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.plaf.ButtonUI; 

/** @see https://stackoverflow.com/a/14429304/230513 */ 
public class JCButtonTest { 

    private void display() { 
     JFrame f = new JFrame("JCButtonTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JCButton(new AbstractAction("JCButton") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(e); 
      } 
     })); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static class JCButton extends AbstractButton { 

     public static final int SIZE = 32; 

     public JCButton(Action action) { 
      this.setModel(new DefaultButtonModel()); 
      System.out.println(action.getValue(Action.NAME)); 
      this.init((String) action.getValue(Action.NAME), null); 
      this.addActionListener(action); 
     } 

     @Override 
     public void updateUI() { 
      setUI((ButtonUI) UIManager.getUI(this)); 
     } 

     @Override 
     public String getUIClassID() { 
      return "ButtonUI"; 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new JCButtonTest().display(); 
      } 
     }); 
    } 
} 
+0

image

는 JBasicComponent의 도출 및 대안으로 두 개의 클래스 – user1874800

+0

의 도출 할 수 없기 때문에, AbtractButton를 사용 _composition_ 및 또는 _delegation_을 고려하지 수 있습니다. – trashgod

1

thread 당신이 그것을 사용하는 방법 샘플 ActionListener의 목적을 이해하는 데 도움이 될 수 있습니다.

1

ActionListener 인터페이스를 구현하십시오. 수행해야 할 일은 청취자를 _button에 위임하는 것입니다.

관련 문제