PDA

View Full Version : [Java] Problemi con la gui (pulsanti ecc) help


Solido
10-10-2011, 19:46
Salve ragazzi mi sono da qualche giorno cimentato in java! Sono alle prime armi con la programmazione ad oggetti. Sempre sentita dire ma mai usata!
Già c'è il fatto che ancora non ci sono proprio entrato poi certi comandi non riesco ad implementarli per bene...è un mix che mi ha fatto fondere!
Avevo visto un esempio di polimorfismo di un esempio abbastanza classico: quello della classe animale e poi i vari oggetti-> cane, gatto ecc che tramite il metodo getverso() dovrebbero fare il verso a seconda dell'animale selezionato!
L'intezione mia era quella di fare una finestra con vari bottoni uno per ogni animale poi associare ad ognuno una figura e un suono!
Chiaramente prima di scrivere ho cercato ma non sono riuscito a venirne fuori! In primis ho visto che ci sono due approcci awt e swing e da quello che ho capito il secondo è quello più gradito implementato dalla seconda versione tanto che ci sono alcuni metodi "deprecati" quali show().
Ora vi metto il macello di codice che ho scritto:D

java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;

public class Fattoria extends Frame {
private JFrame frame;
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
private JButton button5;
private JButton button6;
private JButton button7;
private JButton button8;
private JButton button9;

public Fattoria() {
super();
frame = new JFrame("Fattoria");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(null);
frame.setSize(new Dimension(1000, 1000));
frame.getContentPane().setLayout(new FlowLayout());


frame.ImageIcon icon = new ImageIcon("cane.gif");



button1 = new JButton("Cane", icon);
button1.setIcon(icon);
button1.setDisabledIcon(icon);
button1.setEnabled(false);
button2 = new JButton("Gatto");
button3 = new JButton("Cavallo");
button4 = new JButton("Elefante");
button5 = new JButton("Tigre");
button6 = new JButton("Lupo");
button7 = new JButton("Rana");
button8 = new JButton("Maiale");
button9 = new JButton("Mucca");

button1.setBackground(Color.red);
button2.setBackground(Color.green);
button3.setBackground(Color.white);
button4.setBackground(Color.red);
button5.setBackground(Color.green);
button6.setBackground(Color.white);
button7.setBackground(Color.red);
button8.setBackground(Color.green);
button9.setBackground(Color.cyan); //buttonStop.setLayout(new borderLayout());
//button1.setBounds(5,5,5,5);





JPanel pannello = new JPanel(new GridLayout(3,3)); // crea un pannello!

pannello.add(button1); // aggiunge al pannello i bottoni!
pannello.add(button2);
pannello.add(button3);
pannello.add(button4);
pannello.add(button5);
pannello.add(button6);
pannello.add(button7);
pannello.add(button8);
pannello.add(button9);



frame.add(pannello);
frame.pack();
frame.setVisible(true);


}


}



Spiego alcune cose che magari potrebbero sembrarvi incomprensibili :D
di librerie ne ho importate varie perchè ero nel dubbio!
Se provate l'output a me viene una tab 3x3 con i vari bottoni colorati però non riesco ad andare oltre!
L'audio che per adesso non mi interessa... non riesco però ad applicare l'immagine ad un tasto!Come si fa? ci sono formati predefiniti? va bene se metto le icone nel workspace?
Poi non riesco a dimensionare i vari componenti, cioè: mi da una dimensione di default per la finestra dell'output che posso resizare ma non riesco ad impostarne una dim a mia volontà( lo stesso vale per i bottoni) e poi non riesco ad associare l'immagine che voglio al bottone!

Grazie mille!

banryu79
11-10-2011, 10:51
Ciao Solido, quanto entusiasmo! :D
Frena un attimo, se per te è tutto nuovo; stai cercando di assorbire molti concetti tutti insieme.

Forse non è la risposta che ti aspettavi, però quando uno si cimenta per la prima volta con AWT/Swing è meglio se lo fa dopo essersi letto qualcosa circa gli aspetti basilari della sua architettura.

Fortunatamente c'è un ottimo tutorial qui sul forum al riguardo, ti consiglio di cominciare con questo: Swing Espresso (http://www.hwupgrade.it/forum/showthread.php?t=2005654)

Solido
12-10-2011, 23:14
Ciao Solido, quanto entusiasmo! :D
Frena un attimo, se per te è tutto nuovo; stai cercando di assorbire molti concetti tutti insieme.

Forse non è la risposta che ti aspettavi, però quando uno si cimenta per la prima volta con AWT/Swing è meglio se lo fa dopo essersi letto qualcosa circa gli aspetti basilari della sua architettura.

Fortunatamente c'è un ottimo tutorial qui sul forum al riguardo, ti consiglio di cominciare con questo: Swing Espresso (http://www.hwupgrade.it/forum/showthread.php?t=2005654)


Bella lunghetta hehe... piano piano me la leggerò tutta..anzi no ci devo mettere il giusto. Sono andato però alla ricerca di un concetto e in questa guida non mi chiarisce un concetto!
Il mio scopo è quello di assegnare uno sfondo ad ogni bottone e per fare questo, come indica anche la guida, ho usato ImageIcon.
ImageIcon = new ImageIcon( path)
solo che per me il problema è proprio la directory... io le immagine pernsavo di salvarle nel workspace...è una scelta saggia? nel caso lo sia io come piffero devo settare il mio path?
Io avevo messo così:
"C:://Users/Andrea/workspace/Pannello/Pannello_bin/bin/cane.jpeg
ma probabilmente sbaglio! Tra l'altro non capisco come mai non mi prende il \ che sono le barre che ci sono anche in dos... boh!!!
Qualche consiglio?
grazie mille :)

ps: il formato jpeg va bene?

banryu79
13-10-2011, 11:05
Bella lunghetta hehe... piano piano me la leggerò tutta..anzi no ci devo mettere il giusto.

Lunghetta? :asd:
Considera che il testo di riferimento "Java Swing" conta più di 1000 pagine, e tratta solo le basi. Se veramente vuoi programmare c'è da studiare :D

Quel tutorial è la migliore introduzione che io abbia mai letto su Swing, per sintesi, chiarezza di esposizione, e ordine di trattazione degli argomenti. E tra l'altro è in italiano, più di così...

Comunque l'idea di leggerlo tutto non è sbagliata, anzi. Se ti prendi 3 orette libere lo fai agevolmente.
Comunque anche qui trovi dei riferimenti molto utili:
http://download.oracle.com/javase/tutorial/uiswing/index.html
In particolare consulta "Lesson: Using Swing Components", trovi degli howTo molto comodi.


solo che per me il problema è proprio la directory... io le immagine pernsavo di salvarle nel workspace...è una scelta saggia? nel caso lo sia io come piffero devo settare il mio path?

Supponi di avere questo albero di directory per il tuo progetto nel file system:

MiaApplicazione
|- build
|- dist
|- src
|- mioPackageRadice
|- images

Il tuo package radice(che contiene altri package e sorgenti .java) sta in "src".
Se crei una cartella, diciamo "images", in cui infilare dentro le immagini da caricare come icone per i pulsanti nell'interfaccia grafica, quando verrà eseguita la build del progetto e verrà generato il .jar da distribuire, esso conterrà le immagini.
Potrai fare riferimento a quelle immagini e caricarle a runtime tramite il metodo getResource a cui puoi accedere tramite una qualsiasi classe caricata raggiungibile a partire da mioPackageRadice, in questo modo:

// supponiamo di essere in Fattoria.java
// e che Fattoria.java stia nella cartella mioPackageRadice
// di conseguenza la class Fattoria deve stare nel package mioPackageRadice
package mioPackageRadice;

import javax.swing.ImageIcon;
...

public class Fattoria {
...

// da qualche parte, in Fattoria
ImageIcon loadIcon(String name) {
URL url= Fattoria.class.getResource("/images/" + name);
if (url == null) {
// non ho trovato l'immagine
return null;
} else {
return new ImageIcon(url);
}
}

// da qualche altra parte...
// istanzio un bottone con icona:
Icon icon = loadIcon("smile_icon.png");
JButton button = (icon != null) ?
new JButton("Smile!", icon) : new JButton("Smile!");
}



ps: il formato jpeg va bene?

Sì.

franksisca
13-10-2011, 23:27
Potrei risponderti ma non sarebbe giusto. per vari motivi che ora ti elenco:

1) la pappa pronta fà male nel nostro campo
2) quella guida scende come l'acqua
3) preparati a leggere milioni di pagine (ovviamente in inglese), e fidati che sarà un bene. non finirai mai di imparare.

consiglio spassionato...iniziati a leggere anche la guida sul gridbaglayout....ti faranno impazzire i layout in java, ma se usi bene quello, hai salva la vita!!!

Solido
12-11-2011, 12:36
raga ho letto le parti che mi interessavano della guida e qualcosa ho capito...solo che adesso voelvo riscriverla in un formato un pochino migliore facendo quindi uso di array e di for... fin qui tutto bene solo che mi trovo un errore che non riesco a correggere :


import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Graphics;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class Fattoria extends JPanel {

JButton[] b= new JButton[9];

private static final long serialVersionUID = 1L;


public Fattoria() {
//super();

Component frame = new JFrame("Fattoria");

((JFrame) frame).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(null);
frame.setPreferredSize(new Dimension(1000, 800));

// Praticamente qui vorrei creare i bottoni e assegnar loro l'img tutta nel solito ciclo

for (int j=1; j<10; j++){
b[j]= new JButton("button"+j);
getContentPane().add(b[j]);
final Image immagine = new ImageIcon("src/immagine"+j+".jpg").getImage();
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(immagine, 0, 0,getWidth(),getHeight(), null);
}
};




solo che mi da errore nell'istruzione : public void paintComponent(Graphics g){
dicendomi che void non è un tipo valido di ritorno poi mi dice che ci sono multiple markers at this line indicandomi le parentesi tonde... boh io ho visto in varie guide e ho visto che è una sintassi standard e non capisco dove sbaglio... da qualche parte si menzionano dei metodi ma nn ci ho capito nulla...
qualcuno mi sa aiutare?
grazie mille

Solido
13-11-2011, 15:54
:help:
chiedo anche se qualcuno mi consiglia un libro buono per il java possibilmente in italiano.
Ci sto mettendo impegno ma non riesco cmq a entrare a pieno in questo tipo di programmazione :(

__ZERO_UNO__
13-11-2011, 16:21
Stai definendo una funzione dentro un ciclo e dentro un altra funzione(il costruttore)!!!!!!! :mad:

Miglior libro per principianti di Java: Savitch - Absolute Java. Leggilo con calma e attenzione, ne hai bisogno.

Solido
13-11-2011, 16:30
ok grazie...
ma per quanto riguarda il mio programma come dovrei fare?
io correi solo assegnare tramite il for l'immagini a tutti i miei bottoni!
Dove sbaglio?
prima avevo creato un bottone alla volta e le immagini tornavano anche se i suoni associati ai bottoni facevano i capricci...solo che non si poteva vedere quindi avevo deciso di riscriverlo tramite array e ciclo for

Solido
14-11-2011, 18:54
ho risolto così:

import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

public class Fattoria {


private JFrame frame;
private JPanel pannello;
JButton[] b = new JButton[10];

public Fattoria() {

frame = new JFrame("Fattoria");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(null);
frame.setPreferredSize(new Dimension(1000, 800));

pannello = new JPanel(new GridLayout(3,3)); // crea un pannello!


for (int j = 1; j < 10; j++){
//Toolkit tk= Toolkit.getDefaultToolkit();

final Image immagine = new ImageIcon("src/immagine/" + j +".jpg").getImage();

b[j]= new JButton(){

private static final long serialVersionUID = 1L;

protected void paintComponent(Graphics g){

super.paintComponent(g);
g.drawImage(immagine, 0, 0,getWidth(),getHeight(), null);
}
};

pannello.add(b[j]);// vengono aggiunti i bottoni al pannello dentro il jframe

}

frame.add(pannello);
frame.pack();
frame.setVisible(true);

}


}


ora mi manca di associarci i suoni... ma nn riesco a trovare nulla a riguardo di esauriente... avete qualche consiglio?
ah: c'è qualche altro metodo per prendere il pat di un'immagine o di un suono?
grazie mille!!!