2015-08-14 8 views
5

Also ich habe eine benutzerdefinierte Schaltfläche, die gut läuft, keine Fehler. HierWie kann ich meine benutzerdefinierte Komponente entsprechend anpassen?

ist der Code:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class LukeButton extends JComponent implements MouseListener{ 
    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     frame.setTitle("Luke"); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     LukeButton lb = new LukeButton(); 
     lb.addActionListener(e->{ 
      System.out.println("Success"); 
     }); 
     frame.add(lb, BorderLayout.CENTER); 

     frame.setVisible(true); 
    } 
//ArrayList of listeners 
private final ArrayList<ActionListener> listeners = new ArrayList<ActionListener>(); 

public LukeButton(){ 
    this.addMouseListener(this); 
} 
//Adds a listeners to the list 
public void addActionListener(ActionListener e){ 
    listeners.add(e); 
} 
//Called when button is provoked 
public void fireActionListeners(){ 
    if(!listeners.isEmpty()){ 
     ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "LukeButton"); 
     for(ActionListener l: listeners){ 
      l.actionPerformed(evt); 
     } 
    } 
} 
//Listens for click on my component 
public void mousePressed(MouseEvent e){ 
    fireActionListeners(); 
} 
public Dimension getPreferredSize(){ 
    return new Dimension(100, 100); 
} 
//Draws my button 
public void paintComponent(Graphics g){ 

    super.paintComponent(g); 

    Graphics2D g2 = (Graphics2D)g; 
    Shape rec = new Rectangle2D.Float(10, 10, 60, 80); 

    g2.setColor(Color.BLACK); 
    g2.setStroke(new BasicStroke(5)); 
    g2.draw(rec); 
    g2.setColor(Color.BLUE); 
    g2.fill(rec); 
} 
//Methods that must be over written. 
public void mouseClicked(MouseEvent e){ 
} 
public void mouseEntered(MouseEvent e){ 
} 
public void mouseExited(MouseEvent e){ 
} 
public void mouseReleased(MouseEvent e){ 
} 
} 

Hier ist meine Haupt-Problem-, wann immer ich auf eine beliebige Stelle auf dem JFrame, heißt es auf die Schaltfläche geklickt wurde, aber der einzige Teil möchte ich die Aktion Hörer haben auf ist das blaue Rechteck, das ich auf dem JFrame habe. (Sie werden mein Problem verstehen, wenn Sie mein Programm ausführen) Kann jemand das beheben? Vielen Dank, dass Sie sich die Zeit genommen haben, um zu lesen :)

Antwort

7

Ändern Sie Ihre mousePressed Methode, so dass es zunächst überprüft, ob der Punkt des Klickens durch das blaue Rechteck eingeschlossen ist. Ein einfacher if Block ist alles was benötigt wird. Hinweis: Erstellen Sie Ihr Rectangle nicht innerhalb von paintComponent. Wenn es eine Konstante ist, deklarieren und erstellen Sie es in der Klasse, so dass es in der mousePressed Methode verwendet werden kann. Beachten Sie auch, dass Rectangle2D eine contains(...)-Methode hat, die Ihnen hilft, sehr viel. Beachten Sie auch, dass MouseEvent über eine getPoint()-Methode verfügt, die Ihnen auch sehr hilft, sehr.

Auch, um Ihre Taste zu ändern, überschreiben Sie die getPreferredSize() Methode, wie von mir in Ihrem previous recent question empfohlen wurde. Vermeiden Sie auch, setSize() auf Ihrem JFrame oder einer beliebigen Komponente aufzurufen. Auch, pack() Ihr JFrame vor dem Anzeigen.

+0

Danke, kannte keine dieser Methoden. Ganz grob habe ich noch ein paar Probleme zu lösen, aber das überlasse ich mir einfach :) –

Verwandte Themen