Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [java]java.awt.*

  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [java]java.awt.*

    Prendendo spunto dall' esempio che c'è nella guida di html (intanto che aspetto il libro di java), ho provato a scrivere una classe che prende in input due interi, e crea una finestra di quelle dimensioni.
    Però mi da un errore di sintassi (sono su linux, e sto usando BlueJ).Questo è il codice:
    codice:
    import java.awt.*;
    import java.util.Scanner;
    public class GUI
    {
        private int x,y;
        public void finestra()
        {
            super("Finestra");
            setLocation(100,100);
            setSize(x,y);
            setVisible(true);
        }
        public void interfaccia()
        {
            Scanner s=new Scanner(System.in);
            System.out.println("Digitare dimensione orizzontale finestra: ");
            x=s.nextInt();
            System.out.println("Digitare dimensione verticale finestra: ");
            y=s.nextInt();
            finestra();
        }
        public static void main(String [] args)
        {
            GUI a= new GUI();   
            a.interfaccia();
        }
    }
    L' errore di sintassi è questo:
    codice:
    call to super must be first statement in constructor
    Alla stessa riga dove utilizzo il metodo super.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java]java.awt.*

    Originariamente inviato da ramy89
    codice:
    public class GUI
    {
        private int x,y;
        public void finestra()
        {
            super("Finestra");
    Quel void finestra() è un metodo ... non un costruttore. Pertanto non puoi usare super.

    GUI non estende Frame o JFrame, quindi non è una finestra. I vari setLocation, setSize che invochi sono sul 'this' e per funzionare, GUI dovrebbe essere una finestra.

    Se non vuoi usare l'ereditarietà, in finestra istanzia espressamente un Frame e invoca il resto su questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    L' ho corretto:
    codice:
    import javax.swing.JFrame;
    import java.util.Scanner;
    
    public class Window
    {
      private int l;
      private int a;
    
      public void interfaccia()
      {
          Scanner sc=new Scanner(System.in); 
          System.out.println("Digitare larghezza finestra-> ");
          l=sc.nextInt();
          System.out.println("Digitare altezza finestra-> ");
          a=sc.nextInt();
          JFrame window = new JFrame("Finestra");
          window.setBounds(0,0,l,a);
          window.setVisible(true);
      }
    
      public static void main(String[] args)
      {
        Window a = new Window();
        a.interfaccia();
      }
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ramy89
    L' ho corretto:
    Sì, tecnicamente corretto. Se vuoi che la JVM termini da sola quando il frame viene chiuso dall'utente, devi aggiungere:

    window.setDefaultCloseOperation(WindowConstants.EX IT_ON_CLOSE);

    (o visto che ne hai solo una, basta anche DISPOSE_ON_CLOSE)

    Altrimenti la JVM resta "appesa" perché la finestra, per default, diventa solo "hidden" (nascosta).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ok, ho aggiunto anche quel comando.
    Ma c'è un problema, a volte i metodi che chiamo vengono ignorati.
    Faccio un esempio (in realtà non capita solo con questo metodo, ma anche con altri):
    Ho provato a impostare il colore di background della finestra come arancione, ma mi compare sempre una finestra bianca.
    Ecco il codice (con la riga evidenziata dagli asterischi):
    codice:
    import java.util.Scanner;
    import javax.swing.*;
    import java.awt.*;
    
    
    public class Window
    {
      private int l;
      private int a;
    
      public void interfaccia()
      {
          Scanner sc=new Scanner(System.in); 
          JButton close=new JButton("Chiudi");
          JFrame window = new JFrame("Finestra");
          System.out.println("Digitare larghezza finestra-> ");
          l=sc.nextInt();
          System.out.println("Digitare altezza finestra-> ");
          a=sc.nextInt();
          window.setBounds(0,0,l,a);
          window.setBackground(Color.orange);     /*********** viene ignorato
          window.setVisible(true);
          window.add(close);
          window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      }
    
      public static void main(String[] args)
      {
        Window a = new Window();
        a.interfaccia();
      }
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ramy89
    Faccio un esempio (in realtà non capita solo con questo metodo, ma anche con altri):
    Ho provato a impostare il colore di background della finestra come arancione, ma mi compare sempre una finestra bianca.
    Quello che devi capire è che JFrame è un componente un pochino più complesso rispetto ad altri e ad esempio rispetto al "vecchio" java.awt.Frame.

    Un JFrame contiene come unico "figlio" solo un JRootPane che a sua volta contiene quello che viene chiamato "content pane" (il contenitore dove si aggiungono i componenti) e un "glass pane" (un pannello che per default è nascosto e trasparente che serve per effetti particolari).

    Se fai window.setBackground(....) stai settando la proprietà background del JFrame ma non la "vedi" perché nel JFrame c'è dentro (sopra al suo sfondo) il JRootPane che a sua volta contiene il content pane. E il content pane per default è oltretutto "opaco" e con un suo colore.

    Per farla breve: generalmente la soluzione più veloce è assegnare il colore al content pane.

    window.getContentPane().setBackground(Color.orange);

    P.S. E tutto quello che ho detto è ben documentato, se avessi letto un pochino la documentazione javadoc e/o il tutorial ufficiale di Java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.