2016-09-22 3 views
-1

Ich versuche eine Klasse zu erstellen, die einen weiteren JComponent hinzufügen kann und ein anklickbares Einstellungs-Icon in der oberen rechten Ecke erstellt.Wie kann ich einen Mausklick in einem JPanel nur in einem bestimmten Bereich erfassen?

Ich möchte eine Art von ActionListener hinzufügen, die ausgelöst wird, wenn der Benutzer auf den Bereich der g.drawImage(image, getWidth() - widgetSize, 0, widgetSize, widgetSize, imageObserver) klickt.

Ist dies der richtige Weg, um dieses Problem zu lösen? Oder gibt es bessere Möglichkeiten dafür?

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

hinzufügen 'MouseListener'. Das ['MouseEvent'] (http://docs.oracle.com/javase/8/docs/api/java/awt/event/MouseEvent.html) enthält alle notwendigen Details. –

+0

'new ImageIcon (" src/main/resources/Icon-Settings.png ")' Anwendungsressourcen werden zum Zeitpunkt der Bereitstellung zu eingebetteten Ressourcen. Daher ist es ratsam, sofort auf sie zuzugreifen, als ob sie gerade wären. Auf ein [tag: embedded-resource] muss nicht die Datei, sondern die URL zugreifen. Siehe [Info. Seite für eingebettete Ressource] (http://stackoverflow.com/tags/embedded-resource/info) zum Erstellen der URL. –

Antwort

1

Der beste Weg ist es, eine Taste mit dem angegebenen Symbol und ohne Text (IMHO) hinzuzufügen, die bei der gegebenen Fläche der Platte angeordnet ist. Sie können den Rand der Schaltfläche auch auf null (oder EmptyBorder) setzen, wenn Sie nur das Symbol anzeigen möchten. Für einige L & F müssen Sie auch die Methode AbstractButton.setContentAreaFilled(boolean) mit dem Parameter false aufrufen. Methode addActionListener kann den Anruf an die entsprechende Methode der beiliegenden Schaltfläche weiterleiten.

Hier ist mein Code

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; 
     } 
    } 
} 
Verwandte Themen