Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-05-2010, 10: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, 11: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, 17: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, 17: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 17:07.
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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, 17: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 18:01.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 17: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, 18: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 18:04.
Sbrizzolo86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2010, 18: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, 18: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, 18: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, 18: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, 18: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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
Polestar spinge sull'acceleratore: arriv...
Nuovo record mondiale nel fotovoltaico: ...
L'ultimo baluardo cade: fine supporto pe...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
Arriva il primo computer quantistico ad ...
'Se lavori al PC sei a rischio': la prev...
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: 18:28.


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