Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-05-2010, 09:48   #1
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
[JAVA] Mouse event

Sto cercando di creare un bottone personalizzato e con questo codice ci sono quasi riuscito:
Codice:

import java.awt.*;
import java.awt.event.*;


import javax.swing.*;

class OvalButton extends JComponent implements MouseListener
{

	private static final long serialVersionUID = 1L;
	
	
public OvalButton()
  {
    super();
    enableInputMethods(false);	
    addMouseListener(this);
    setFocusable(true);
           
  }
  public void setBounds(){
	  this.setBounds(0, 0, 200, 120);
  }

  public void paintComponent(Graphics g)
  {
	  
    super.paintComponent(g);
    Graphics2D antiAlias = (Graphics2D)g;
    antiAlias.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(Color.RED);
    g.fillOval(0, 0, 200, 120);

  }
@Override
public void mouseClicked(MouseEvent e) {
	System.out.println(""+e);
	
}
@Override
public void mouseEntered(MouseEvent e) {
	// TODO Auto-generated method stub
	
}
@Override
public void mouseExited(MouseEvent e) {
	// TODO Auto-generated method stub
	
}
@Override
public void mousePressed(MouseEvent e) {
	
}
@Override
public void mouseReleased(MouseEvent e) {
	// TODO Auto-generated method stub
	
}



}
Se andate ad aggiungere il bottone ad un jpanel ho il problema che viene stampato nella console ovunque click del mouse anche fuori dall'ovale, dove ho sbagliato? Cosa Manca?
Vi prego è urgente, devo consegnare un elaborato.
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 10:36   #2
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Potresti postare anche il codice in cui istanzi il button e gli aggiungi un ascoltatore?
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:02   #3
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
visto che il listener già l'ho aggiunto alla classe basta fare:

Ovalbutton button = new OvalButton();
JFrame frame= new JFrame();
frame.add(button);
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:05   #4
lupoxxx87
Senior Member
 
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
penso che il problema stia nel fatto che tu vai ad "ascoltare" un qualsiasi click del mouse, non solo i click del mouse sopra al tuo componente...

Ultima modifica di lupoxxx87 : 06-05-2010 alle 16:07.
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:22   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il componente occupa con buona probabilità tutta la superficie del suo contenitore.

C'è un setBounds nel tuo codice che per come è messo corre il rischio di essere irrilevante.

Puoi controllare eliminando quel setBounds e scrivendo una cosa tipo questa:

OvalButton button = new OvalButton();
button.setPreferredSize(new Dimension(200, 120));
JPanel container = new JPanel(new FlowLayout());
container.add(button);
finestra.add(container);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:31   #6
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
grazie delle risposte l'idea del setbounds e del container è buona ma nella console viene stampato click anche fuori dall'ovale mi spiego è come se avessi un bottone rettangolare con l'ovale in mezzo.. sto pensando che sia sbagliato estendere JComponent.. forse dovrei estendere JButton ma poi come faccio a fare l'override sulla forma del bottone?
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:45   #7
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Quote:
Originariamente inviato da Dolcezeus Guarda i messaggi
grazie delle risposte l'idea del setbounds e del container è buona ma nella console viene stampato click anche fuori dall'ovale mi spiego è come se avessi un bottone rettangolare con l'ovale in mezzo.. sto pensando che sia sbagliato estendere JComponent.. forse dovrei estendere JButton ma poi come faccio a fare l'override sulla forma del bottone?
Prima che PGI-Bis scrivesse stavo per scrivere la stessa cosa.

Se vuoi che quel setBounds() abbia un senso (se proprio vuoi), prova a richiamare .setLayout(null) sul panel contenitore dell'OvalButton. Ovviamente così facendo rinunci alle potenzialità dei Layout Manager.

Per renderti conto di quello che sta succendendo, puoi fare così:

1) eredita da JPanel invece che da JComponent
2) nel costruttore scrivi
Codice:
this.setOpaque(true);

//va bene qualsiasi colore che crei contrasto così te ne accorgi
this.setBackground(Color.gray);
3) sorpresa Sicuramente vedrai che l'area del componente è ben maggiore di quella dell'ovale, come ha detto PGI.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:49   #8
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
ho esposto già la "sorpresa" per piacere aiutatemi devo creare sto maledetto bottone ovale...
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:50   #9
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Forse ora ho capito meglio.

A te dà fastidio che l'area cliccabile sia il rettangolo in cui è inscritto l'ovale e non l'ovale.

Questo è un bel problema. Non credo che con JButton risolvi molto.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:53   #10
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Al tuo posto, avendo questa esigenza, risolverei il tutto con un controllo sulle coordinate del mouse al click. Se sono all'interno dell'ovale faccio qualcosa, altrimenti niente.

Alessandro
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:54   #11
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
il problema sta nel fatto che l'ovale dovrà spostarsi sullo schermo all'interno di un jFrame ad ogni click
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:57   #12
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Quote:
Originariamente inviato da Dolcezeus Guarda i messaggi
il problema sta nel fatto che l'ovale dovrà spostarsi sullo schermo all'interno di un jFrame ad ogni click
Non fa niente, puoi fare un controllo sulle coordinate RELATIVE all'interno dell'ovale.

Per ottenere le coordinate relative puoi usare i metodi per ottenere la risoluzione dello schermo e le dimensioni della finestra. Il resto sono calcoli...

Se aspetti un minuto vedo se ritrovo il pezzo di codice dove ho calcolato queste coordinate...ho avuto un problema simile un po' di tempo fa.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:58   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
La verifica la puoi fare anche così:

(Il tuo bottone, con delle dimensioni di default)
Codice:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;


public class OvalButton extends JComponent implements MouseListener
{
    private static final long serialVersionUID = 1L;

    private static final Dimension DEFAULT_SIZE = new Dimension(100, 70);

    public OvalButton() {
        super();
        enableInputMethods(false);
        addMouseListener(this);
        setFocusable(true);
        setVisible(true);

        // size the component
        sizeMe();
    }

    public void sizeMe() {
        setSize(DEFAULT_SIZE);
        setPreferredSize(DEFAULT_SIZE);
        setMinimumSize(DEFAULT_SIZE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D antiAlias = (Graphics2D)g;
        antiAlias.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        antiAlias.setPaintMode();
        antiAlias.setColor(Color.RED);
        Rectangle rect = getBounds();
        antiAlias.fillOval(1, 1, rect.width-2, rect.height-2);
    }

    @Override
    public void paintBorder(Graphics g) {
        super.paintBorder(g);
        Rectangle rect = getBounds();
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, rect.width-1, rect.height-1);
    }

    @Override public void mouseClicked(MouseEvent e) {
            System.out.println(""+e);
    }
    @Override public void mouseEntered(MouseEvent e) {}
    @Override public void mouseExited(MouseEvent e) {}
    @Override public void mousePressed(MouseEvent e) {}
    @Override public void mouseReleased(MouseEvent e) {}


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Bottone?");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        OvalButton but = new OvalButton();
        //but.setPreferredSize(new Dimension(140, 90));
        JPanel pan = new JPanel();
        pan.setBorder(new TitledBorder("Pannello"));
        pan.add(but);
        frame.add(pan, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
Questo disegna l'ovale e disegna anche i bordi del componente.
Tutti i click che vanno a finire dentro i bordi del componente (cioè nel componente) vengono "sentiti".

Il fatto è che i componenti sono tutti delle aree rettangolari.

@EDIT:
potresti associare all'area "ovale" del tuo componente una java.awt.Shape. E poi, ad ogni click che il componente riceve, controllare se il click cade dentro la Shape. (Vedi package java.awt.geom).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 06-05-2010 alle 17:01.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 16:59   #14
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
ti ringrazio ma mi sà di una cosa poco "pulita" il mio prof mi ammazzerebbe è che nn sò come cambiare l'aspetto ad un bottone ereditandone tutte le altre ottime proprietà.
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:02   #15
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Mah, potrei anche sbagliarmi, ma non mi pare che si possano personalizzare le forme dei componenti. Non credo che il tuo professore pretenda questo.

Comunque non ho trovato il codice, però ricordo gli "ingredienti" principali:

evt.getYOnScreen()
evt.getXOnScreen()

this.getLocationOnScreen().y
this.getLocationOnScreen().x

evt.getYOnScreen()-this.getLocationOnScreen().y dovrebbe essere già la coordinata Y relativa che ti serve.

EDIT:
una volta risolto il problema delle coordinate relative, l'approccio di banryu79 (analogo a quello che ti ho consigliato ma più elegante dato usi funzioni già pronte con gli Shape) non mi sembra così "sporco" come dici.

Ultima modifica di Sbrizzolo86 : 06-05-2010 alle 17:04.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:05   #16
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
banryu79 ma non risolvo il problema...
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:06   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Sbrizzolo86 Guarda i messaggi
Mah, potrei anche sbagliarmi, ma non mi pare che si possano personalizzare le forme dei componenti. Non credo che il tuo professore pretenda questo.
Beh, delle strade si trovano sempre -> http://today.java.net/pub/a/today/20...g-windows.html

Però se il suo prof pretende questo, mi sa che non ha le idee chiare
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:11   #18
Sbrizzolo86
Member
 
Iscritto dal: Dec 2009
Messaggi: 46
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Beh, delle strade si trovano sempre -> http://today.java.net/pub/a/today/20...g-windows.html

Però se il suo prof pretende questo, mi sa che non ha le idee chiare
Grandissime AWTUtilities...le usai per creare meravigliosi effetti di trasparenza.
Beh in informatica quasi tutto è possibile, però sto prof ha un po' esagerato.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:12   #19
Dolcezeus
Member
 
Iscritto dal: Jul 2008
Messaggi: 43
io non sono un guro di java ma se la filosofia del riuso e dell'oggetto è quella che si lege nei libri è possibile fare qualsiasi cosa con un componente... solo che io non riesco a capì come...
Dolcezeus è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17:16   #20
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da Dolcezeus Guarda i messaggi
grazie delle risposte l'idea del setbounds e del container è buona ma nella console viene stampato click anche fuori dall'ovale mi spiego è come se avessi un bottone rettangolare con l'ovale in mezzo.. sto pensando che sia sbagliato estendere JComponent.. forse dovrei estendere JButton ma poi come faccio a fare l'override sulla forma del bottone?
Puoi usare uno Shape (Ellipse2D nel tuo caso). Super-pseudo codice

private Shape shape = new Ellipse2D.Double(0, 0, 200, 120);
...
paintComponent(Graphics g) {...
Graphics2D graphics= (Graphics2D) g;
graphics.fill(shape) o graphics.draw(shape);

Nel tuo mouseClicked verifichi se il punto del click è contenuto nello shape:

if(shape.contains(e.getX(), e.getY()) {
...è stato cliccato il componente E il punto di click è contenuto nello shape.
}

Questo tiene conto della posizione del componente sullo schermo (le coordinate del mouseClick sono relative all'origine del componente).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Robot più veloci dell'uomo: la me...
Palantir-manifesto, tra tecnologia e ide...
Classifica Amazon top 10 sconvolta: nuov...
DRAM, domanda fuori controllo: produzion...
HUDIMM e HSODIMM: la risposta dell'indus...
Il riconoscimento facciale è un'a...
Un affare pazzesco, finché dura o...
Lava a 75°, è un 21.000Pa con...
iPhone 18 Pro: il componente che garanti...
DeepL alza il livello: con Voice-to-Voic...
Apple sta utilizzando sempre più ...
Il MacBook Neo vende tanto? Microsoft le...
AST SpaceMobile BlueBird 7: Blue Origin ...
È il momento migliore per comprar...
Svendita MacBook Pro: c'è il mode...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v