2016-09-22 1 views
-1

또 다른 JComponnent를 추가 할 수있는 클래스를 만들어 Top-Right Corner에 클릭 가능한 설정 아이콘을 만듭니다.특정 영역의 JPanel에서 마우스 커서를 어떻게 재구성 할 수 있습니까?

사용자가 g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver) 영역을 클릭 할 때 발생하는 ActionListener를 추가하고 싶습니다.

이 문제를 해결하는 올바른 방법입니까? 아니면 더 좋은 방법이 있습니까?

package de.display; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionListener; 
import java.awt.image.ImageObserver; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class JWidget extends JPanel { 

    private int widgetSize = 50; 
    private boolean showWidgetIcon = true; 

    Image image; 
    ImageObserver imageObserver; 

    public JWidget() { 
     this(new ImageIcon("src/main/resources/Icon-Settings.png")); 
    } 

    public JWidget(String filename) { 
     super(); 
     ImageIcon icon = new ImageIcon(filename); 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public JWidget(ImageIcon icon){ 
     super(); 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if(showWidgetIcon) 
     { 
      g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver); 
     } 
    } 

    public int getWidgetSize() { 
     return widgetSize; 
    } 

    public void setWidgetSize(int widgetSize) { 
     this.widgetSize = widgetSize; 
    } 

    public void setImageIcon(ImageIcon icon) { 
     image = icon.getImage(); 
     imageObserver = icon.getImageObserver(); 
    } 

    public boolean isWidgetIconVisible() { 
     return showWidgetIcon; 
    } 

    public void setShowWidgetVisibility(boolean showWidgetIcon) { 
     this.showWidgetIcon = showWidgetIcon; 
    } 

    public void addPressSettingsActionListener(ActionListener actionListener) 
    { 
     listenerList.add(ActionListener.class, actionListener); 
    } 
} 
+0

'MouseListener'을 추가합니다. ['MouseEvent'] (http://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseEvent.html)에는 필요한 모든 세부 정보가 들어 있습니다. –

+0

'new ImageIcon ("src/main/resources/Icon-Settings.png")'애플리케이션 리소스는 배포 시점까지 임베디드 리소스가 될 것이므로 지금 당장 액세스하는 것이 현명합니다. [tag : embedded-resource]는 파일이 아닌 URL로 액세스해야합니다. [info. URL을 구성하는 방법은 임베디드 리소스 페이지 (http://stackoverflow.com/tags/embedded-resource/info)를 참조하십시오. –

답변

1

가장 좋은 방법은 지정된 아이콘과 텍스트가없는 버튼 (IMHO)을 패널의 지정된 영역에 추가하는 것입니다. 아이콘이 그려지기를 원한다면 단추 테두리를 null (또는 EmptyBorder)로 설정할 수도 있습니다. 일부 L & F의 경우 AbstractButton.setContentAreaFilled(boolean) 메서드를 호출하여 매개 변수를 false로 호출해야합니다. 메서드 addActionListener은 동봉 된 단추에 해당하는 메서드로 호출을 전달할 수 있습니다.

여기에 내 코드

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionListener; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.plaf.basic.BasicButtonUI; 

public class JWidget extends JPanel { 

    private boolean showWidgetIcon = true; 

    private BasicButton button = new BasicButton(null, 50); 

    public JWidget() { 
     this(new ImageIcon("src/main/resources/Icon-Settings.png")); 
    } 

    public JWidget(String filename) { 
     super(new BorderLayout()); 

     ImageIcon icon = new ImageIcon(filename); 
     button.setIcon(icon); 
     initLayout(); 
    } 

    public JWidget(ImageIcon icon) { 
     super(new BorderLayout()); 
     button.setIcon(icon); 
     initLayout(); 
    } 

    private void initLayout() { 
     removeAll(); 
     if (showWidgetIcon) { 
      JPanel rightLayoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0)); 
      add(rightLayoutPanel, BorderLayout.NORTH); 
      rightLayoutPanel.add(button); 
     } 
    } 

    public int getWidgetSize() { 
     return button.getButtonSize(); 
    } 

    public void setWidgetSize(int widgetSize) { 
     button.setButtonSize(widgetSize); 
     revalidate(); 
     repaint(); 
    } 

    public void setImageIcon(ImageIcon icon) { 
     button.setIcon(icon); 
    } 

    public boolean isWidgetIconVisible() { 
     return showWidgetIcon; 
    } 

    public void setShowWidgetVisibility(boolean showWidgetIcon) { 
     this.showWidgetIcon = showWidgetIcon; 
     initLayout(); 
    } 

    public void addActionListener(ActionListener al) { 
     button.addActionListener(al); 
    } 

    private static class BasicButton extends JButton { 
     private int buttonSize; 

     /** 
     * 
     */ 
     public BasicButton(Icon anIcon, int aSize) { 
      super(anIcon); 
      buttonSize = aSize; 
     } 

     @Override 
     public void updateUI() { 
      setUI(new BasicButtonUI()); 
      setBorder(null); 
      setContentAreaFilled(false); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(buttonSize, buttonSize); 
     } 

     public int getButtonSize() { 
      return buttonSize; 
     } 

     public void setButtonSize(int size) { 
      this.buttonSize = size; 
     } 
    } 
} 
관련 문제