Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-02-2010, 17:21   #1
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
[JAVA]errore posizionamento dialog usando JOptionPane

Salve,
cerco lumi per capire una cosa che da solo non riesco bene a spiegarmi.

Stavo esercitandomi nell'uso di javax.swing.SwingWorker (fin'ora mi sono sempre smazzato la gestione dei thread per i "task" in Swing "a mano" cioè con l'uso di SwingUtilities.invokeLater e tonnellate di codice [error prone], che probabilmente potrei risparmiarmi) implementando con esso un task che, mentre genera i primi N numeri primi, li stampa in una text area.
Alla fine il task proietta pure una dialog che mostra il tempo impiegato nell'eseguire se stesso.

Il task (uno SwingWorker) ha un riferimeto alla JTextArea della gui, per poterci appendere ogni singolo numero primo calcolato.

Quando deve visualizzare la dialog che mostra il tempo trascorso, lo fa invocando uno dei metodi 'showMessageDialog' di JOptionPane, passando come parametro 'parentComponent' il riferimento alla text area.

Mi aspettavo che la dialog venisse mostrata centrata sul JFrame della mia gui (la text area riferita si trova la dentro ) ma pare di no: o meglio, viene centrata solo sulle ascisse, ma non sulle ordinate.

Ecco il codice:
Codice:
package swingworker;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
/**
 * SwingWorker example: find first N prime numbers updating a JTextArea during computation.
 * @author francesco
 */
@SuppressWarnings("serial")
public class PrimeNumbers
{
    JFrame frame;
    JTextArea area;
    PrimeNumberTask task;

    public PrimeNumbers()
    {
        frame = new JFrame("Brute force prime number finder.");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        area = new JTextArea(15, 33);
        area.setEditable(false);
        JScrollPane centralPane = new JScrollPane(area);
        frame.add(centralPane, BorderLayout.CENTER);

        JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        SpinnerNumberModel model = new SpinnerNumberModel(10000,1000,100000,500);
        final JSpinner spinner = new JSpinner(model);
        JLabel label1 = new JLabel("Find first");
        JLabel label2 = new JLabel("prime numbers");
        final JButton doButton = new JButton("Do action!");
        doButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int N = (Integer) spinner.getValue();
                task = new PrimeNumberTask(area, N);
                task.addPropertyChangeListener(new TaskListener(doButton));
                task.execute(); // on a worker thread
            }
        });
        JButton popButton = new JButton("Pop up!");
        popButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Popped up!\nSwing is very responsive, if used well");
            }
        });
        JButton clearButton = new JButton("Clear");
        clearButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                area.setText("");
            }
        });
        southPanel.add(label1);
        southPanel.add(spinner);
        southPanel.add(label2);
        southPanel.add(clearButton);
        southPanel.add(popButton);
        southPanel.add(doButton);
        frame.add(southPanel, BorderLayout.SOUTH);
    }

    private void showUp()
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
    
    public static void main(String... argv)
    {
        PrimeNumbers application = new PrimeNumbers();
        application.showUp();
    }

    class TaskListener implements PropertyChangeListener
    {
        final JButton button;

        TaskListener(JButton b) {
            button = b;
        }

        public void propertyChange(PropertyChangeEvent evt) {
            if ("state".equals(evt.getPropertyName())
            && task.getState() == SwingWorker.StateValue.STARTED) {
                button.setEnabled(false);
            }

            if ("state".equals(evt.getPropertyName())
            && task.getState() == SwingWorker.StateValue.DONE) {
                button.setEnabled(true);
            }
        }
    }
}


/*
 * this is the task (subclass SwingWorker) that:
 * 1] computes the prime numbers.
 * 2] print each computed prime in a text area.
 * 3] when finished show a pop up dialog with time elapesed
 */
final class PrimeNumberTask extends SwingWorker<List<Integer>, Integer>
{
    final JTextArea texArea;
    final int N;

    private boolean finished;
    private List<Integer> numbers;
    private long startTime;

    public PrimeNumberTask(JTextArea textArea, int n) {
        this.texArea = textArea;
        this.N = n;

        finished = false;
        numbers = new ArrayList<Integer>(n);

        // HOMO ERECTUS DEBUG STRATEGY:
        System.out.println(""+textArea.getParent());//JViewport
        System.out.println(""+textArea.getParent().getParent());//JScrollPane
        System.out.println(""+textArea.getParent().getParent().getParent());//JPanel
        System.out.println(""+textArea.getParent().getParent().getParent().getParent());//JLayeredPane
        System.out.println(""+textArea.getParent().getParent().getParent().getParent().getParent());//JRootPane
        System.out.println(""+textArea.getParent().getParent().getParent().getParent().getParent().getParent());//JFrame
        System.out.println(""+textArea.getParent().getParent().getParent().getParent().getParent().getParent().getParent());//null
    }

    @Override
    protected List<Integer> doInBackground() throws Exception 
    {
        startTime = System.nanoTime()/1000000;

        while(!finished && !isCancelled()) {
            int number = nextPrime();
            publish(number);
        }

        return numbers;
    }

    @Override
     protected void process(List<Integer> chunks)
    {
         for (int number : chunks) {
             texArea.append(String.valueOf(number)+"\n");
         }
     }

    @Override
    public void done()
    {
        long elapsedTime = (System.nanoTime()/1000000) - startTime;
        JOptionPane.showMessageDialog(texArea, "Founded first "+N+" primes in "+elapsedTime+" millisec.");
    }

    private int nextPrime()
    {
        int prime;
        if (numbers.size() > 0) {
            prime = numbers.get(numbers.size()-1);
        }
        else {
            prime = 0;
        }

        boolean found = false;
        while (!found) {
            prime++;
            found = isPrime(prime);
        }

        numbers.add(prime);

        // abbiamo finito?
        finished = (numbers.size()==N);

        return prime;
    }

    private boolean isPrime(int candidate)
    {
        // caso zero
        if (candidate == 0) {
            return false;
        }

        // caso numero uno
        if (candidate == 1) {
            return true;
        }

        // brute force:
        int div = 2;
        while (candidate%div != 0) {
            div++;
        }
        return div == candidate;
    }

}
Ed ecco il risultato sul mio pc:


Qualcuno sa quale è il problema?
__________________

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 : 10-02-2010 alle 17:29.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-02-2010, 17:41   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
centrala sullo scroller e non sull'area di testo.
__________________
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 10-02-2010, 17:48   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
centrala sullo scroller e non sull'area di testo.
ho sostituito:
Codice:
JOptionPane.showMessageDialog(textArea, "Founded first "+N+" primes in "+elapsedTime+" millisec.");
con:
Codice:
JOptionPane.showMessageDialog(textArea.getParent().getParent(), "Founded first "+N+" primes in "+elapsedTime+" millisec.");
ed effettivamente fa quello che ci si aspetta.

Grazie della dritta, ma potresti anche spiegarmi il motivo del perchè funziona così?
Avevo spulciato un po' il codice delle API e avevo capito che Swing risale da solo al parent del component finchè non verifica che il component che ha tra le mani è un instanceof di Frame.
__________________

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 10-02-2010, 17:58   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Il frame viene usato per creare la finestra di dialogo modale. La posizione è calcolata rispetto all'area occupata dal componente che passi al metodo showXYZ.

Il problema qui è che la tua area di testo è inserita in un JViewport (che viene creato quando l'area di testo è inserita nel JScrollPane). JViewport fa sì che la finestra assuma le dimensioni che gli servono e poi ne "ritaglia" una fetta per la proiezione sullo schermo.

Così tu hai un area di testo che "crede" di essere molto più alta di quanto in verità appaia e questa credenza è trasmessa al JOptionPane.

se fai una prova noterai che lo spostamento si verifica solo quando appaiono le barre di scorrimento nel JScrollPane - cioè quando l'area di testo e la sua proiezione hanno dimensioni diverse - mentre la centratura è corretta quando la finestra occupa la stessa area del JViewport.
__________________
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 10-02-2010, 23:21   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Il frame viene usato per creare la finestra di dialogo modale. La posizione è calcolata rispetto all'area occupata dal componente che passi al metodo showXYZ.
Ah, ho sbagliato a pensare che la posizione la calcolasse rispetto alla finestra in cui è contenuto il componente.
Per curiosità ho riguardato meglio le API di JOptionPane e in effetti ad un certo punto, durante l'inizializzazione della dialog, c'è una chiamata sulla stessa a setLocationRelativeTo() con il componente che viene passato come argomento.

Per i dettagli della faccenda di JViewport invece non ne sapevo nulla, grazie delle spiegazioni.
E tanto di cappello PGI, a furia di leggerti comincio a credere che se non sai tutte le API quasi a memoria poco ci manca
__________________

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
 Rispondi


HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
Assetto Corsa EVO, l'update 0.10 porta l...
Il documentario su Elon Musk fermato per...
Tutte le principali tecnologie NVIDIA DL...
Ultimate Performance: il piano segreto d...
iPhone Duo senza compromessi: i benchmar...
Metallo liquido per CPU e GPU, ecco cosa...
WINDTRE rimodula ancora: la linea fissa ...
Giù di altri 100€ ECOVACS T90S PR...
Galaxy S27 Ultra con chip Exynos? Qualco...
La NASA annuncia alcuni aggiornamenti pe...
Meridian Space si separa da SpinLaunch e...
Gli astronomi hanno scoperto stelle che ...
Facebook cambia il feed: ora l'algoritmo...
I nuovi Vivo X500 potrebbero costare qua...
Due pallet di RTX 5090 spariti nel nulla...
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:39.


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