Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Urgentissimo: Il Frame non risponde + ai comandi utente

    Salve,
    ho un problema urgentissimo. Ho solo tempo fino a lunedì. Sono disperato. Ho creato un programma JAVA di cui vi scrivo di seguito i sorgenti. Quando premo sul pulsante conferma parte l'applicazione che genere all'infinito thread, ma l'intera interfaccia utente (realizzata con le awt) si "congela" e non riesco nemmeno a chiudere il JFrame. Sono in cerca di una soluzione.

    public class Semaforo extends JPanel
    {
    private Image image,image1;
    private boolean state=true;

    public Semaforo()
    {

    image=Toolkit.getDefaultToolkit().getImage("tpa//green.jpg");
    image1=Toolkit.getDefaultToolkit().getImage("tpa//red.jpg");
    MediaTracker tracker=new MediaTracker(this);
    tracker.addImage(image,0);
    tracker.addImage(image1,1);
    try{tracker.waitForID(0);
    tracker.waitForID(1);}catch(InterruptedException e){

    }
    }

    public void paintComponent(Graphics g) {


    super.paintComponent(g);


    if(state==true)
    g.drawImage(image, 0, 0, null);
    else
    g.drawImage(image1,0,0,null);



    }




    public void setState(boolean state) {
    Graphics g=getGraphics();
    this.state = state;
    paintComponent(g);
    }

    }
    ---------------------------------------------------------------------------------------
    public class ParcheggioGUI extends JFrame implements ActionListener{
    private JLabel ptot=new JLabel("Posti Totali");
    private TextField ptotfield=new TextField(20);
    private Button conferma=new Button("Conferma");
    private JLabel pdisp=new JLabel("N° posti disponibili");
    private TextField pdispfield=new TextField(5);
    private Semaforo sem = new Semaforo();
    private JLabel image=new JLabel(new ImageIcon("tpa//parcheggio.jpg"));
    private TextArea cron=new TextArea(10,40);
    public ParcheggioGUI(){

    pdispfield.setEnabled(false);
    this.setTitle("Display");
    this.setSize(400,450);
    this.setResizable(false);
    getContentPane().setLayout(new GridBagLayout());
    GridBagConstraints gbc=new GridBagConstraints();
    add(image,gbc,0,0,1,1);

    add(ptot,gbc,0,1,1,1);
    gbc.anchor=GridBagConstraints.WEST;
    gbc.insets=new Insets(0,0,0,10);
    add(ptotfield,gbc,1,1,1,1);

    add(pdisp,gbc,0,2,1,1);
    gbc.anchor=GridBagConstraints.CENTER;
    gbc.insets=new Insets(10,0,0,0);
    add(pdispfield,gbc,1,2,2,2);
    gbc.anchor=GridBagConstraints.EAST;
    add(conferma,gbc,3,1,1,1);
    conferma.addActionListener(this);
    gbc.anchor=GridBagConstraints.SOUTH;
    gbc.fill=GridBagConstraints.BOTH;
    gbc.ipady=20;
    add(sem,gbc,3,2,1,1);

    gbc.anchor=GridBagConstraints.SOUTH;
    gbc.fill=GridBagConstraints.RELATIVE;
    gbc.anchor=GridBagConstraints.SOUTH;
    gbc.insets=new Insets(10,0,0,0);
    add(cron,gbc,0,4,4,1);

    }
    public void add(Component c,GridBagConstraints gbc, int x, int y, int w, int h){
    gbc.gridx=x;
    gbc.gridy=y;

    gbc.gridwidth=w;
    gbc.gridheight=h;
    this.getContentPane().add(c,gbc);
    }

    public void update(int numPosti, boolean state)
    {
    pdispfield.setText(""+numPosti);
    sem.setState(state);
    }


    public JLabel getPtot(){
    return ptot;
    }
    public TextField getPtotField(){
    return ptotfield;
    }
    public JLabel getPdisp(){
    return pdisp;
    }
    public TextField getPdispField(){
    return pdispfield;
    }
    public Semaforo getSem(){
    return sem;
    }
    public Button getConferma(){
    return conferma;
    }
    public TextArea getCron(){
    return cron;
    }
    public void actionPerformed(ActionEvent e){

    ptotfield.setEnabled(false);
    pdispfield.setEnabled(false);
    int capienza=Integer.parseInt(ptotfield.getText());
    if(capienza==0){
    ptotfield.setEnabled(true);
    JOptionPane.showMessageDialog(null,"Inserisci un intero > 0");
    }
    else{
    ptotfield.setText("Parking for "+capienza+" vehicles");
    Parcheggio p=new Parcheggio(capienza,this);


    for(;{

    int attesa=(int)(Math.random()*5000);
    int azione=(int)(Math.random()*2);
    String action="Entra";
    if(azione==1 && p.getNumeroPosti()!=capienza)
    action="Esce";
    Thread t=new Thread(new Auto(action,p,this));
    t.start();


    try{
    Thread.sleep(attesa);
    }catch(InterruptedException a){
    System.out.println(a.getMessage());
    }
    }
    }
    }
    }
    ----------------------------------------------------------------------------------------
    public class Auto extends Thread {
    private String azione;
    private Parcheggio p;
    private ParcheggioGUI gui;
    public Auto(String azione, Parcheggio p,ParcheggioGUI gui){
    this.azione=azione;
    this.p=p;
    this.gui=gui;
    }

    public void run(){
    //p.getNumeroPosti();

    if(azione.compareTo("Entra")==0){
    synchronized(p){
    try{
    p.AutoEntra();

    p.getNumeroPosti();
    }catch(ParcheggioFullException e){gui.getCron().append(""+e.getMessage()+"\n");
    }
    }
    }
    else{
    synchronized(p){

    p.AutoEsce();
    p.getNumeroPosti();
    }
    }

    }

    }

    ----------------------------------------------------------------------------------------
    public class main {

    /**
    * @param args
    */
    public static void main(String[] args) {

    // TODO Auto-generated method stub
    ParcheggioGUI gui=new ParcheggioGUI();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    gui.show();
    }
    }

    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465

    Moderazione

    Comprendo l'urgenza, ma non inserire esortazioni nei titoli delle discussioni in quanto hanno tutte la stessa priorità all'interno del forum.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

    Re: Moderazione

    Ho risolto da me. Grazie lo stesso.

  4. #4
    Come hai risolto?

  5. #5

    Ho risolto così

    Originariamente inviato da Aglieglie
    Come hai risolto?
    Il Thread che esegue l'aggiornamento dell'interfaccia, ovvero il thread che esegue il metodo ActionPerformed, rimaneva bloccato all'infinito nel ciclo for ed essendo impegnato ad eseguire le istruzioni in esso, non era in grado di aggiornare l'interfaccia. Quindi ho creato un altro Thread che esegue le istruzioni del ciclo for (e rimane in esso bloccato) al posto del thread che esegue l'aggiornamento dell'interfaccia, mentre il thread che esegue l'aggiornamento dell'interfaccia, diventa libero . Cmq la modifica riguarda solo la classe ParcheggioGUI di cui riporto il listato modificato (in rosso la parte modificata):

    package tpa;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.Button;
    import java.awt.Component;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.TextArea;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import java.util.*;
    public class ParcheggioGUI extends JFrame implements ActionListener,Runnable
    {
    private JLabel ptot=new JLabel("Posti Totali");
    private JTextField ptotfield=new JTextField(20);
    private JButton conferma=new JButton("Conferma");
    private JLabel pdisp=new JLabel("N° posti disponibili");
    private JTextField pdispfield=new JTextField(5);
    private Semaforo sem = new Semaforo();
    private JLabel image=new JLabel(new ImageIcon("tpa//parcheggio.jpg"));
    private JTextArea cron=new JTextArea(10,40);

    public ParcheggioGUI()
    {
    cron.setEnabled(false);
    pdispfield.setEnabled(false);
    this.setTitle("Display");
    this.setSize(400,400);
    this.setResizable(false);
    getContentPane().setLayout(new GridBagLayout());
    GridBagConstraints gbc=new GridBagConstraints();
    gbc.insets=new Insets(0,0,0,10);
    add(image,gbc,0,0,1,1);
    add(ptot,gbc,0,1,1,1);
    gbc.anchor=GridBagConstraints.WEST;
    gbc.insets=new Insets(0,0,0,10);
    gbc.ipadx=150;
    add(ptotfield,gbc,1,1,1,1);
    gbc.ipadx=0;
    add(pdisp,gbc,0,2,1,1);
    gbc.anchor=GridBagConstraints.CENTER;
    gbc.insets=new Insets(10,0,0,0);
    gbc.ipadx=90;
    add(pdispfield,gbc,1,2,2,2);
    gbc.ipadx=0;
    gbc.anchor=GridBagConstraints.EAST;
    gbc.insets=new Insets(10,0,0,0);
    add(conferma,gbc,3,1,1,1);
    conferma.addActionListener(this);
    gbc.anchor=GridBagConstraints.SOUTH;
    gbc.fill=GridBagConstraints.BOTH;
    gbc.ipady=20;
    add(sem,gbc,3,2,1,1);
    gbc.anchor=GridBagConstraints.EAST;
    gbc.ipady=120;
    add(new JScrollPane(cron),gbc,0,4,4,1);
    }

    public void add(Component c,GridBagConstraints gbc, int x, int y, int w, int h)
    {
    gbc.gridx=x;
    gbc.gridy=y;
    gbc.gridwidth=w;
    gbc.gridheight=h;
    this.getContentPane().add(c,gbc);
    }

    public void update(int numPosti, boolean state)
    {
    pdispfield.setText(""+numPosti);
    sem.setState(state);
    }

    public JLabel getPtot()
    {
    return ptot;
    }

    public JTextField getPtotField()
    {
    return ptotfield;
    }

    public JLabel getPdisp()
    {
    return pdisp;
    }

    public JTextField getPdispField()
    {
    return pdispfield;
    }

    public Semaforo getSem()
    {
    return sem;
    }

    public JButton getConferma()
    {
    return conferma;
    }

    public JTextArea getCron()
    {
    return cron;
    }

    public void actionPerformed(ActionEvent e)
    {
    conferma.setEnabled(false);
    Runnable r=this;
    Thread t=new Thread(r);
    t.start();
    }
    public void run()
    {
    int capienza=0;
    boolean sentinella=true;
    ptotfield.setEnabled(false);
    pdispfield.setEnabled(false);
    try{
    capienza=Integer.parseInt(ptotfield.getText());}ca tch(Exception a){
    JOptionPane.showMessageDialog(null,"Inserisci un intero");
    sentinella=false;
    ptotfield.setEnabled(true);
    }
    if(capienza==0 && sentinella==true){
    ptotfield.setEnabled(true);
    JOptionPane.showMessageDialog(null,"Inserisci un intero > 0");
    }
    else if(capienza!=0 && sentinella==true){
    ptotfield.setText("Parking for "+capienza+" vehicles");
    Parcheggio p=new Parcheggio(capienza,this);

    for(;{
    int attesa=(int)(Math.random()*5000);
    int azione=(int)(Math.random()*2);
    String action="Entra";
    if(azione==1 && p.getNumeroPosti()!=capienza)
    action="Esce";
    Thread t=new Thread(new Auto(action,p,this));
    t.start();
    try{
    Thread.sleep(attesa);
    }catch(InterruptedException a){
    System.out.println(a.getMessage());
    }
    }
    }
    }

  6. #6
    Ma prima hai inserito tutto programma? se non erro ci manca la classe parcheggio potresti inserirla?

  7. #7

    Ho inserito solo la classe che ha subito modifiche

    Originariamente inviato da Aglieglie
    Ma prima hai inserito tutto programma? se non erro ci manca la classe parcheggio potresti inserirla?
    Ciao,
    nel mio messaggio precedente, ho inserito solo la classe che ha subito modifiche, ovvero la classe ParcheggioGUI, tutte le altre classi sono rimaste invariate e il codice puoi vederlo leggendo il mio primo messaggio. Non esiste una classe Parcheggio, ma le classi sono Auto che simula l'entrata e l'uscita delle auto dal parcheggio, Semaforo che disegna sulla GUI un'immagine raffigurante un semaforo e aggiorna il colore del samaforoa seconda della disponibilità di posti (rosso=parcheggio pieno, verde=almeno 1 posto disponibile), ParcheggioGUI, appunto, e la classe main. Ciao

  8. #8
    Grazie per le risposte.

    Nella classe ParcheggioGUI c'è questo pezzo di codice:
    else if(capienza!=0 && sentinella==true){
    ptotfield.setText("Parking for "+capienza+" vehicles");
    Parcheggio p=new Parcheggio(capienza,this);
    Se non esiste la classe Parcheggio logicamente ti segnale l'errore.

    Questo
    Parcheggio p=new Parcheggio(capienza,this);
    a cosa si riferisce?

    Grazie ciao

  9. #9

    Scusami. Hai ragione

    Originariamente inviato da Aglieglie
    Grazie per le risposte.

    Nella classe ParcheggioGUI c'è questo pezzo di codice:


    Se non esiste la classe Parcheggio logicamente ti segnale l'errore.

    Questo a cosa si riferisce?

    Grazie ciao
    Scusami, sono proprio uno sbadato. Ero convinto di aver inserito tutte le classi. In effetti manca la classe Parcheggio. Eccotela subito:

    package tpa;
    import java.text.DateFormat;
    import java.util.Date;
    import java.util.Locale;

    public class Parcheggio
    {
    private DateFormat dateformatter;
    private DateFormat timeformatter;
    private Locale local=new Locale("en");
    private int capienza;
    private int numeropostiDisponibili;
    private ParcheggioGUI gui;

    public Parcheggio(int numeropostiDisponibili,ParcheggioGUI gui)
    {
    this.gui=gui;
    this.numeropostiDisponibili=capienza=numeropostiDi sponibili;
    }

    public synchronized int getNumeroPosti()
    {
    gui.getPdispField().setText(""+numeropostiDisponib ili);
    return numeropostiDisponibili;
    }

    public synchronized void AutoEntra() throws ParcheggioFullException
    {
    if(numeropostiDisponibili==1){
    dateformatter=DateFormat.getDateInstance(DateForma t.FULL,local);
    timeformatter=DateFormat.getTimeInstance(DateForma t.DEFAULT,local);
    gui.getCron().append("Un'auto è entrata at "+dateformatter.format(new Date())+" at "+timeformatter.format(new Date())+"\n");
    numeropostiDisponibili-=1;
    gui.update(numeropostiDisponibili, false);
    }
    else if(numeropostiDisponibili==0)
    throw new ParcheggioFullException("Spiacente, il parcheggio è pieno");
    else{
    dateformatter=DateFormat.getDateInstance(DateForma t.FULL,local);
    timeformatter=DateFormat.getTimeInstance(DateForma t.DEFAULT,local);
    gui.getCron().append("Un'auto è entrata at "+dateformatter.format(new Date())+" at "+timeformatter.format(new Date())+"\n");
    numeropostiDisponibili-=1;
    gui.update(numeropostiDisponibili, true);
    }
    }
    public synchronized void AutoEsce()
    {
    if (capienza == numeropostiDisponibili)
    return;
    dateformatter=DateFormat.getDateInstance(DateForma t.FULL,local);
    timeformatter=DateFormat.getTimeInstance(DateForma t.DEFAULT,local);
    gui.getCron().append("Un'auto è uscita at "+dateformatter.format(new Date())+" at "+timeformatter.format(new Date())+"\n");
    numeropostiDisponibili+=1;
    gui.update(numeropostiDisponibili, true);
    }
    }

    Manca anke la classe ParcheggioFullException che la classe Parcheggio invoca. Eccotela:
    package tpa;
    import java.util.*;

    public class ParcheggioFullException extends Exception
    {
    public ParcheggioFullException(){
    super();
    }

    public ParcheggioFullException(String message)
    {
    super(message);
    }
    }


    Scusami ancora. Giancarlo

  10. #10
    Scusarti di cosa? anzi ti ringrazio.

    PS: adesso ti mando un messaggio privato ho bisogno di alcune informazioni.

    Grazie ancora ciao

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.