Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2009, 16:13   #1
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
[Java - Swing] Centrare un'immagine in un JDialog

Allora la situazione è questa:
ho progettato un JPanel tramite il designer grafico di NetBeans e questa è l'anteprima



Ora io vorrei trasformare questo oggetto JPanel in un JDialog, in modo da poter essere istanziato e visualizzato direttamente senza fare un add().
Ho provato a modificare il codice generato da NetBeans da così a così

Codice:
public class StartForm extends javax.swing.JPanel
public class StartForm extends javax.swing.JDialog
ma mi dà il seguente errore in compilazione (ho ovviamente modificato il codice che utilizza la classe in modo da essere corretto. Sembra che l'errore sia generato dal GroupLayout in fase di visualizzazione (setVisible(true))
Codice:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: GroupLayout can only be used with one Container at a time
        at javax.swing.GroupLayout.checkParent(GroupLayout.java:1095)  <<<<<<<<
        at javax.swing.GroupLayout.invalidateLayout(GroupLayout.java:987)
        at java.awt.Container.invalidate(Container.java:1455)
        at java.awt.Component.addNotify(Component.java:6432)
        at java.awt.Container.addNotify(Container.java:2585)
        at javax.swing.JComponent.addNotify(JComponent.java:4683)
        at java.awt.Container.addNotify(Container.java:2592)
        at javax.swing.JComponent.addNotify(JComponent.java:4683)
        at java.awt.Container.addNotify(Container.java:2592)
        at javax.swing.JComponent.addNotify(JComponent.java:4683)
        at javax.swing.JRootPane.addNotify(JRootPane.java:735)
        at java.awt.Container.addNotify(Container.java:2592)
        at java.awt.Window.addNotify(Window.java:638)
        at java.awt.Dialog.addNotify(Dialog.java:747)
        at java.awt.Dialog.conditionalShow(Dialog.java:891)
        at java.awt.Dialog.show(Dialog.java:1034)
        at java.awt.Component.show(Component.java:1422)
        at java.awt.Component.setVisible(Component.java:1375)
        at java.awt.Window.setVisible(Window.java:806)
        at java.awt.Dialog.setVisible(Dialog.java:985) <<<<<<<
        at backtris.StartForm.<init>(StartForm.java:22)
        at backtris.TrisApplication.showStarterForm(TrisApplication.java:33)
        at backtris.TrisApplication.<init>(TrisApplication.java:22)
        at backtris.TrisWindow.<init>(TrisWindow.java:12)
        at backtris.TrisWindow$1.run(TrisWindow.java:23)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
L'errore mi viene visualizzato in console 2 volte e non visualizza niente (la JVM però non termina).
Non ho voglia di scoprire cosa c'è che non funziona e mi piacerebbe scrivere a mano il codice del pannello.

Però non saprei come fare. Prenderò ovviamente spunto dal codice auto-generato, ma non userò il GroupLayout.
Quell'immagine dei dadi, nella mia idea, deve stare al centro della finestra o, meglio, al centro del riquadro ideale formato dai bordi della finestra e dal bordo inferiore della label "Click to...".
Come posso fare?
L'immagine è visualizzata, nel codice auto-generato, tramite un JButton avente un'icona coprente. Questo il codice:
Codice:
jButton1 = new javax.swing.JButton();
...
jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/backtris/dice.jpg")));
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2009, 09:01   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Imposti il LayoutManager della tua JDialog a BorderLayout (se non lo è già di default, ora non ricordo) e aggiungi il JButton (un add() da qualche parte dovrà pure farlo) in BorderLayout.CENTER.

Forse non ho capito la situazione?
__________________

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 09-11-2009, 11:07   #3
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Imposti il LayoutManager della tua JDialog a BorderLayout (se non lo è già di default, ora non ricordo) e aggiungi il JButton (un add() da qualche parte dovrà pure farlo) in BorderLayout.CENTER.

Forse non ho capito la situazione?
Ho pensato anche io a questo, ma il JButton non si ridimensiona fino a toccare i bordi? Oppure specificando una dimensione mi viene corretto?
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2009, 12:02   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Ho pensato anche io a questo, ma il JButton non si ridimensiona fino a toccare i bordi? Oppure specificando una dimensione mi viene corretto?
Sì, scusa, mi ero dimenticato del problemuccio dell'espansione

Infilando il button in un JPanel gestito da GridBagLayout e infilando quest'ultimo nella JDialog con posizione BorderLayout.CENTER il bottone resta sempre centrato:
Codice:
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.Window;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 *
 * @author francesco
 */
public class ButtonCentered extends JDialog
{
    public static void main(String... args) {
        java.awt.Window nullOwner = null;
        ButtonCentered bc = new ButtonCentered(nullOwner, "Button is Centered");
        bc.showUp();
    }

    public ButtonCentered(Window owner, String title) {
        super(owner, title);
        initialize();
    }

    private void initialize() {
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.setSize(500, 350);
        this.setLayout(new BorderLayout());
            JPanel container = new JPanel();
            container.setLayout(new GridBagLayout());
                JButton button = new JButton("CENTERED");
            container.add(button);
        this.add(container, BorderLayout.CENTER);
    }

    private void showUp() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ButtonCentered.this.setVisible(true);
            }
        });
    }

}
__________________

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 : 09-11-2009 alle 12:04.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2009, 21:40   #5
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Sì, scusa, mi ero dimenticato del problemuccio dell'espansione

Infilando il button in un JPanel gestito da GridBagLayout e infilando quest'ultimo nella JDialog con posizione BorderLayout.CENTER il bottone resta sempre centrato:
Codice:
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.Window;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 *
 * @author francesco
 */
public class ButtonCentered extends JDialog
{
    public static void main(String... args) {
        java.awt.Window nullOwner = null;
        ButtonCentered bc = new ButtonCentered(nullOwner, "Button is Centered");
        bc.showUp();
    }

    public ButtonCentered(Window owner, String title) {
        super(owner, title);
        initialize();
    }

    private void initialize() {
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.setSize(500, 350);
        this.setLayout(new BorderLayout());
            JPanel container = new JPanel();
            container.setLayout(new GridBagLayout());
                JButton button = new JButton("CENTERED");
            container.add(button);
        this.add(container, BorderLayout.CENTER);
    }

    private void showUp() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ButtonCentered.this.setVisible(true);
            }
        });
    }

}
Oh, grazie. 2/3 mesi fa ho letto per metà il tutorial di PGI sul GridBag e non mi ricordo niente, sarà ora di dare una rinfrescata!
Appena posso provo quel codice.
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2009, 00:42   #6
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
GridBagLayout rinfrescato e risultato ottenuto senza particolari difficoltà!

Il codice
Codice:
package backtris;

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class StartForm extends JDialog {

    private Player starter;
    private boolean clicked = false;

    public StartForm(Window owner) {
        super(owner, ModalityType.DOCUMENT_MODAL);
        initComponents();
        this.centerOnScreen(new Dimension(320, 260));
    }

    private JButton jButton1;
    private JLabel jLabel1, jLabel2;
    private ImageIcon dice;

    private void initComponents() {
        this.setLayout(new GridBagLayout());
        GridBagConstraints lim = new GridBagConstraints();
        lim.insets = new Insets(10, 10, 10, 10);
        jLabel1 = new JLabel("Click the dices to see which player will start...");
        lim.gridx = 0;
        lim.gridy = 0;
        this.add(jLabel1, lim);
        dice = new ImageIcon(getClass().getResource("/backtris/dice.jpg"));
        jButton1 = new JButton();
        jButton1.setIcon(dice);
        jButton1.setPreferredSize(new Dimension(dice.getIconWidth(), dice.getIconHeight()));
        jButton1.setBorder(null);
        jButton1.setBorderPainted(false);
        jButton1.setFocusPainted(false);
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!clicked) {
                    clicked = true;
                    int r = new Random().nextInt();
                    if (r % 2 == 1) {
                        jLabel2.setText("Cpu player starts");
                        starter = Player.CPU;
                    } else {
                        jLabel2.setText("Human player starts");
                        starter = Player.HUMAN;
                    }
                    Timer t = new Timer(3000, new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            dispose();
                        }
                    });
                    t.setRepeats(false);    //occhio
                    t.start();
                }
            }
        });
        lim.gridx = 0;
        lim.gridy = 1;
        this.add(jButton1, lim);
        jLabel2 = new JLabel(" ");
        jLabel2.setFont( new Font("Tahoma", Font.BOLD, 11) );
        lim.gridx = 0;
        lim.gridy = 2;
        this.add(jLabel2, lim);
    }

    private void centerOnScreen(Dimension window) {
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds(screen.width / 2 - window.width / 2, screen.height / 2 - window.height / 2, window.width, window.height);
    }

    public Player getStarter() {
        return this.starter;
    }
}
produce la seguente finestra



Grazie dell'aiuto!
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Motorola moto g67 a 229,90€ e edge 70 a ...
Scontata di oltre 50€ reali, a 179€ Robo...
Final Fantasy VII Revelation ha una data...
Super venduta perché va benissimo...
Torna a soli 34,19€ grazie a un coupon: ...
Samsung ci riprova? Nel 2027 potrebbe ar...
Questo portatile HP da 469€ in offerta &...
Fujifilm ha annunciato il nuovo super-te...
Il drone NASA Dragonfly atterrerà...
Il telescopio spaziale Hubble ha ripreso...
Face ID di Apple di nuovo in tribunale: ...
Eizo presenta il primo ColorEdge OLED e ...
NASA cambia il design della tuta lunare ...
Riscaldamento globale: l'ONU certifica i...
Il nuovo modello di trascrizione vocale ...
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:02.


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