Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Un PC da gaming costa troppo? Con questa...
Non solo iPhone: è questa la vera...
Rigenerazione territoriale: Huawei trasf...
Batteria e-bike a rischio incendio? L'in...
Assetto Corsa Evo: i dintorni del Nordsc...
HP pronta a introdurre memorie cinesi in...
Apple supera Samsung e conquista la lead...
L'UE vuole il nostro feedback sull'open ...
Polestar chiude in crescita il 2025, nuo...
Stranger Things sbarca sui device Samsun...
Grok finisce sotto indagine nel Regno Un...
Arriva in Italia il nuovo marchio iCAUR,...
Obiettivo raggiunto: mille tablet OPPO c...
Nintendo nega l'uso dell'intelligenza ar...
Zeekr apre gli ordini per la station wag...
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: 17:58.


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