2015-08-14 18 views
5

Quindi ho un pulsante personalizzato, che funziona bene, senza errori.Come posso dimensionare il mio componente personalizzato in modo appropriato?

Ecco il codice:

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

Ecco il mio problema-principale quando mai clicco ovunque sul JFrame, si dice è stato fatto clic sul pulsante, ma l'unica parte che voglio avere l'ascoltatore azione su è il rettangolo blu che ho sulla JFrame. (Avrai sotto il mio problema se si esegue il mio programma) Qualcuno sa come risolvere questo problema? Grazie per aver dedicato del tempo a leggere :)

risposta

7

Modifica il tuo mousePressed metodo in modo che prima controlla se il punto di clic è racchiuso dal rettangolo blu. Un semplice se blocco è tutto ciò che è necessario. Nota: non creare il tuo Rectangle all'interno di paintComponent. Se è una costante, dichiararla e crearla nella classe in modo che possa essere utilizzata nel metodo mousePressed. Nota inoltre che Rectangle2D ha un metodo contains(...) che ti aiuterà molto a molto. Nota inoltre che MouseEvent ha un metodo getPoint() che ti aiuterà anche molto molto.

Inoltre, per ridimensionare il pulsante, ignorare il metodo getPreferredSize() come consigliato da me nel proprio previous recent question. Inoltre, evita di chiamare setSize() sul tuo JFrame o su qualsiasi componente. Inoltre, pack() tuo JFrame prima di mostrarlo.

+0

Grazie, non sapevo di nessuno di questi metodi. Di grossolane ho ancora un piccolo problema da risolvere, ma lo lascerò a me stesso :) –

Problemi correlati