Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
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


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
iPhone 17: su Amazon partono i preordini...
WhatsApp Android Beta: in arrivo i threa...
Intergalactic: The Heretic Prophet sar&a...
Gmail introduce la sezione Acquisti per ...
Con Data Transfer Essentials Google Clou...
Per i computer quantistici piovono milia...
SEGA si sbarazza di decine di prototipi ...
Borderlands 4 su Steam è un caso:...
Windows 10 si aggiorna ancora in antepri...
Samsung Galaxy S25 FE già in offerta su ...
Cyber Tyre: la tecnologia Pirelli che tr...
DeepMind vuole rivoluzionare Big Pharma ...
YouTuber 'taglia' la sua Switch 2 per in...
Microsoft, clima teso dopo i licenziamen...
Successo per Tineco a IFA 2025: ricca co...
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: 13:41.


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