2016-09-22 9 views
-1

別のJComponnentを追加して、右上のコーナーにクリック可能な設定アイコンを作成できるクラスを作成しようとしました。指定された領域だけ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 ")'アプリケーションリソースは、デプロイ時に埋め込まれたリソースになるので、今のようにアクセスすることをお勧めします。 [タグ:埋め込みリソース]は、ファイルではなくURLでアクセスする必要があります。 [info。埋め込みリソースのページ](http://stackoverflow.com/tags/embedded-resource/info)を参照してください。 –

答えて

1

最も良い方法は、指定されたアイコンとテキスト(IMHO)が付いていないボタンをパネルの所定の領域に追加することです。また、アイコンを塗りたい場合は、ボタンのボーダーをnull(またはEmptyBorder)に設定することもできます。 L & Fの中には、パラメータがfalseのメソッドAbstractButton.setContentAreaFilled(boolean)も呼び出す必要があります。 メソッド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; 
     } 
    } 
} 
関連する問題