Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2009, 17: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, 10: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, 12: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, 13: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 13:04.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2009, 22: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, 01: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


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
PlayStation come NVIDIA DLSS: Sony punta...
OnePlus Nord 6 sta arrivando e avr&agrav...
CPU desktop: Intel dice addio ai socket ...
Google sta testando un'app di Gemini per...
NVIDIA GeForce RTX 5070 Laptop: in arriv...
Il Tribunale di Roma ha annullato la mul...
AppleCare One potrebbe arrivare presto i...
Amazon ci riproverà: l'azienda st...
Apple e Samsung dominano la classifica d...
Un game designer di 9 anni, due fogli a ...
Il weekend Amazon parte col botto: gross...
Amazfit Active 2 scende a 69,99€: i migl...
Smart TV No IVA su Amazon: QLED, Mini-LE...
C'è un TV OLED da 65'' a 900€, ma anche ...
Non solo smartphone: OnePlus sta per lan...
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: 16:18.


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