2015-08-14 14 views
5

Mam więc niestandardowy przycisk, który działa dobrze, bez błędów.Jak odpowiednio dostosować rozmiar niestandardowego komponentu?

Oto kod:

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){ 
} 
} 

Tu jest mój główny problem-gdy kiedykolwiek kliknij gdziekolwiek na JFrame, to mówi, że przycisk został kliknięty, ale tylko część Chcę mieć słuchacza działania na jest niebieski prostokąt, który mam na ramce JFrame. (Będziesz mógł znieść mój problem, jeśli uruchomisz mój program) Czy ktoś wie, jak to naprawić? Dziękujemy za poświęcenie czasu na przeczytanie :)

Odpowiedz

7

Zmień metodę mousePressed, aby najpierw sprawdzić, czy punkt kliknięcia jest otoczony niebieskim prostokątem. Prosty blok if to wszystko, czego potrzeba. Uwaga: nie twórz prostokąta wewnątrz paintComponent. Jeśli jest to stała, zadeklaruj i utwórz ją w klasie, aby mogła być używana w metodzie mousePressed. Zauważ też, że Rectangle2D ma metodę contains(...), która bardzo ci pomoże. Zauważ też, że MouseEvent ma metodę getPoint(), która również bardzo ci pomoże.

Ponadto, aby zmienić rozmiar przycisku, należy zastąpić jego metodę getPreferredSize() zgodnie z zaleceniami, którą poleciłem w swoim numerze previous recent question. Ponadto unikaj wywoływania setSize() w swoim JFrame lub w dowolnym komponencie. Ponadto, przed wyświetleniem JFrame, należy podać pack().

+0

Dzięki, nie wiedziałem o żadnej z tych metod. Z grubsza mam jeszcze trochę problemów do rozwiązania, ale zostawię to sobie. –