2016-09-22 64 views
-1

我嘗試創建一個可以添加另一個JComponnent並在右上角創建可點擊的設置圖標的類。如何在只有指定區域的JPanel中記錄鼠標點擊?

我喜歡添加某種ActionListener,當用戶點擊g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver)的區域時引發。

這是解決此問題的正確方法嗎?或者有更好的方法嗎?

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

'新的ImageIcon(「src/main/resources/Icon-Settings.png」)應用程序資源在部署時將成爲嵌入式資源,所以現在開始訪問它們是明智的。 [tag:embedded-resource]必須通過URL而不是文件訪問。請參閱[信息。頁面爲嵌入式資源](http://stackoverflow.com/tags/embedded-resource/info)如何形成的URL。 –

回答

1

最好的辦法是用給定的圖標和沒有文本(IMHO),其被放置在板的給定區域中添加一個按鈕。如果您只想繪製圖標,也可以將按鈕的邊框設置爲空(或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; 
     } 
    } 
} 
相關問題