Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207

    [JAVA] accedere alle celle in un GridLayout

    Ragazzi praticamente sto seguendo il consiglio di adbin datomi in un altro post : svilupparmi un calendario da solo..solo che cominciano a sorgere i primi problemi...vi spiego

    come mostrato nella figura che allegherò, ho già fatto il mio panel con il GridLayout e all'interno di ogni cella del Grid ho inserito un pannello.Ora il problema è questo: la prima riga deve contenere dei bottoni e ogni bottone deve avere come label un giorno della settimana, cominciando quindi da lunedì per finire alla domenica.

    Dalla seconda riga in poi..ogni pannello deve contenere tre bottoni di uguale dimensione.

    Voglio capire, come faccio ad accedere alla singola cella di un GridLayout per inserire i bottoni che voglio??

    thanks....

    screen della mia interfaccia:



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

    Re: [JAVA] accedere alle celle in un GridLayout

    Originariamente inviato da jin85
    come mostrato nella figura che allegherò, ho già fatto il mio panel con il GridLayout e all'interno di ogni cella del Grid ho inserito un pannello.Ora il problema è questo: la prima riga deve contenere dei bottoni e ogni bottone deve avere come label un giorno della settimana, cominciando quindi da lunedì per finire alla domenica.

    Dalla seconda riga in poi..ogni pannello deve contenere tre bottoni di uguale dimensione.

    Voglio capire, come faccio ad accedere alla singola cella di un GridLayout per inserire i bottoni che voglio??
    Gli elementi li aggiungi nel panel che ha il GridLayout con il solito add(). La questione è che non ti servirebbe nemmeno specificare un qualche "indice" della cella. Facendo semplicemente degli add(unComponente) il GridLayout si riempie da sinistra verso destra e dall'alto verso il basso. Cioè ti basta solo riempire tutta la griglia una volta sola all'inizio.

    I primi 7 componenti saranno dei JButton, il resto saranno tutti componenti di una tua classe che estende JPanel (e che conterrà quei 3 pulsanti). In quest'ultima tua classe puoi mettere un metodo che permette di impostare il giorno del mese e magari, ad esempio, se è 0, lo rendi non visibile. Così puoi cambiare la visualizzazione del calendario, senza toccare la struttura di tutta la tua griglia.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    guarda sinceramente avevo letto anch'io così su qualche manuale, ma nn so xkè..quando vado ad aggiungere i bottoni al pannello con il Grid li comincia ad inserire partendo da sotto..e nn comincia nemmeno dall'estrema destra..ma dal centro dell'ultima riga...come mai??

    se mi dici come posso postarti il codice lo metto volentieri...

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    allora io ho risolto così..per i giorni della settimana ho fatto un pannello a parte...separato dal pannello dove verranno i giorni del mese (per intenderci quelli da 1 a 31).




    nel primo pannello si sceglierà il mese e l'anno
    nel secondo pannello "Giorni della settimana" inserisco i bottoni per i giorni della settimana
    nel terzo pannello "Giorni del mese" andranno i giorni del determinato mese.

    ora i problemi che ho sn i seguenti :

    1) è una buona soluzione questa che ho adottato??cioè separare i bottoni dei giorni della settimana da quelli dei singoli giorni del mese?

    2)come posso fare per allineare i singoli giorni di ogni mese sotto il rispettivo bottone??cioè..tutti i lunedì sotto il bottone lun , tutti i martedì sotto il bottono mar e così via....

    3)c'è per caso qualche funzione di calendar o gregoriancalendar che mi restituisce i singoli giorni della settimana abbreviati ("Lun" "Mar" "Mer" "Gio" "Ven" "Sab" "Dom")??cioè invece di metterla io a mano, come stringa, la label di ogni bottone dei giorni della settimana..c'è qualche funzione che me li restituisce??

    come al solito grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jin85
    1) è una buona soluzione questa che ho adottato??cioè separare i bottoni dei giorni della settimana da quelli dei singoli giorni del mese?
    Direi che può andare benissimo. Qui si tratta solo di una pura questione "estetica" che può piacere o non piacere.

    Originariamente inviato da jin85
    2)come posso fare per allineare i singoli giorni di ogni mese sotto il rispettivo bottone??cioè..tutti i lunedì sotto il bottone lun , tutti i martedì sotto il bottono mar e così via....
    Immagino che per il pannello "Giorni della settimana" hai usato un GridLayout di 1x7 celle con un certo "gap" orizzontale. Se nel pannello di sotto dei giorni del mese usi ancora GridLayout per avere Nx7 (N dovrebbe essere 6 per il massimo di righe possibili) celle con lo stesso identico gap e fintanto che i due pannelli hanno la stessa identica larghezza, è chiaro che tutto sarà allineato.

    Originariamente inviato da jin85
    3)c'è per caso qualche funzione di calendar o gregoriancalendar che mi restituisce i singoli giorni della settimana abbreviati ("Lun" "Mar" "Mer" "Gio" "Ven" "Sab" "Dom")??cioè invece di metterla io a mano, come stringa, la label di ogni bottone dei giorni della settimana..c'è qualche funzione che me li restituisce??
    Se non ti interessano le questioni di "internazionalizzazione" puoi tranquillamente mettere dei testi fissi. Se vuoi invece che tutta la interfaccia possa adattarsi ad un certo locale, beh, allora innanzitutto vedi la classe java.text.DateFormatSymbols. Crei un DateFormatSymbols con un certo locale (o quello di default) e poi puoi avere tutte le informazioni sui simboli con getShortWeekdays(), getMonths() ecc....

    La questione della internazionalizzazione non sarebbe comunque tutta qui. Ad esempio in certi locale (es. quello americano/inglese) il primo giorno della settimana è Domenica, non Lunedì. Quindi la sequenza dei giorni della settimana va opportunamente gestita.

    Insomma ... una cosa è gestire il calendario in modo "fisso" e stabilito per un certo locale (es. italiano) e un'altra cosa è sfruttare tutte le informazioni fornite dalle varie classi di Java per adattarsi ad un certo qualunque locale. Scegli tu .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    Allora andbin, ho seguito il tuo suggerimento per quanto riguarda i giorni del mese, mi sono creato una classe a parte che estende JPanel e contiene i tre bottoni ( i tre bottoni li ho colorati in modo differente per una questione visiva)..ho aggiunto questa "componente" al pannello "Giorni del mese" e questo è il risultato :




    ora voglio riuscire a capire :

    1)come faccio a mettere in ogni cella i giorni corrispondenti al mese e all'anno voluto??la formattazione come faccio a farla, in modo da avere tutti i lunedì del mese sotto il tasto lunedì..tutti i martedì sotto il tasto martedì..e così via..

    2)essendo la singola cella composta da tre bottoni...cm farò a visualizzare ad esempio il numero 1, corrispondente al giorno 1 del mese X (x sta per un mese qualsiasi)..cioè in poche parole..la label con il numero del giorno cm faccio a metterla??nn essendo un unico bottone..

    3) ho un problema, quando vado a cliccare sulla combobox per scegliere il mese, questa si apre a cascata, però i bottoni "Lun" e "Mar" mi oscurano parte della visualizzazione a cascata..come si fa per far apparire la combobox in primo piano rispetto ai bottoni??

    Per il post precedente..adbin..mi serve solo il locale italiano..quindi nn ho bisogno delle opzione di internazionalizzazione

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    Inserisco qui le due classi per ora create, la classe principale MainApplet e quella che estende JPanel contenente i tre bottoni..la classe Trebottoni l'ho aggiunta al pannello "Giorni del mese" tramite il ciclo for che ho messo in neretto..va bene così??

    classe MainApplet


    public class MainApplet extends JApplet{
    private JPanel jPanel1;
    private JComboBox jComboBox1;
    private JSpinner jSpinner1;
    private JPanel jPanel2;
    private JPanel jPanel;
    protected Calendar calendar;
    protected Locale locale;
    private JPanel jPanel3;
    protected String[] dayNames;
    protected int maxDayCharacters;
    protected JButton[] days;
    //protected Color sundayForeground;
    //protected Color weekdayForeground;
    //private JButton[] daysButton = new JButton[7];


    {

    //Set Look & Feel
    try {
    javax.swing.UIManager.setLookAndFeel("com.sun.java .swing.plaf.windows.WindowsLookAndFeel");
    } catch(Exception e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    JFrame frame = new JFrame();
    MainApplet inst = new MainApplet();
    frame.getContentPane().add(inst);
    ((JComponent)frame.getContentPane()).setPreferredS ize(inst.getSize());
    frame.pack();
    frame.setVisible(true);
    }
    public MainApplet() {
    super();
    initGUI();
    }


    private void initGUI() {

    {
    this.setSize(511, 385);
    getContentPane().setLayout(null);
    {
    jPanel1 = new JPanel();
    getContentPane().add(jPanel1);
    jPanel1.setBorder(BorderFactory.createTitledBorder (null, "Mese/Anno", TitledBorder.LEADING, TitledBorder.TOP));
    jPanel1.setLayout(null);
    jPanel1.setBounds(0, 0, 511, 56);
    {
    SpinnerListModel jSpinner1Model = new SpinnerListModel(
    new String[] { "2008", "2009", "2010", "2011", "2012",
    "2013", "2014" });
    jSpinner1 = new JSpinner();
    jPanel1.add(jSpinner1);
    jSpinner1.setModel(jSpinner1Model);
    jSpinner1.setBounds(399, 14, 98, 28);
    jSpinner1.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
    jSpinner1.getEditor().setBorder(new LineBorder(new java.awt.Color(0,0,0),1,false));
    jSpinner1.getEditor().setEnabled(false);
    }
    {
    ComboBoxModel jComboBox1Model = new DefaultComboBoxModel(
    new String[] { "gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre","ottobre", "novembre", "dicembre" });
    jComboBox1 = new JComboBox();
    jPanel1.add(jComboBox1);
    jComboBox1.setModel(jComboBox1Model);
    jComboBox1.setBounds(14, 14, 98, 28);
    }
    }
    {
    jPanel2 = new JPanel();
    GridLayout jPanel2Layout = new GridLayout(1, 0);
    jPanel2Layout.setHgap(5);
    jPanel2Layout.setVgap(5);
    jPanel2Layout.setColumns(0);
    jPanel2Layout.setRows(1);
    jPanel2.add(new Button("Lun"));
    jPanel2.add(new Button("Mar"));
    jPanel2.add(new Button("Mer"));
    jPanel2.add(new Button("Gio"));
    jPanel2.add(new Button("Ven"));
    jPanel2.add(new Button("Sab"));
    jPanel2.add(new Button("Dom"));
    getContentPane().add(jPanel2);
    jPanel2.setBorder(BorderFactory.createTitledBorder (null, "Giorni della settimana", TitledBorder.LEADING, TitledBorder.TOP));
    jPanel2.setLayout(jPanel2Layout);
    jPanel2.setBounds(0, 56, 511, 63);





    }
    {
    jPanel3 = new JPanel();
    GridLayout jPanel3Layout = new GridLayout(5, 7);
    jPanel3Layout.setHgap(5);
    jPanel3Layout.setVgap(5);
    jPanel3Layout.setColumns(7);
    jPanel3Layout.setRows(5);


    getContentPane().add(jPanel3);
    jPanel3.setBorder(BorderFactory.createTitledBorder (null, "Giorni del mese", TitledBorder.LEADING, TitledBorder.TOP));
    jPanel3.setLayout(jPanel3Layout);
    jPanel3.setBounds(0, 119, 511, 266);
    }
    for (int i=0; i<35; i++) {
    Trebottoni pannello = new Trebottoni();
    jPanel3.add(pannello);
    }




    }
    }
    }

    classe Trebottoni

    public class Trebottoni extends JPanel{
    private JPanel jPanel1;
    private JButton Button2;
    private JButton Button3;
    private JButton Button1;

    public Trebottoni (){
    //private void initGUI() {
    try {
    {
    this.setPreferredSize(new java.awt.Dimension(105, 42));
    this.setLayout(null);
    {
    jPanel1 = new JPanel();
    this.add(jPanel1);
    jPanel1.setLayout(null);
    jPanel1.setBounds(0, 0, 105, 42);

    {
    Button1 = new JButton();
    jPanel1.add(Button1);
    Button1.setBounds(0, 0, 105, 14);
    Button1.setBackground(Color.yellow);
    }
    {
    Button2 = new JButton();
    jPanel1.add(Button2);
    Button2.setBounds(0, 14, 105, 14);
    Button2.setBackground(Color.orange);
    }
    {
    Button3 = new JButton();
    jPanel1.add(Button3);
    Button3.setBounds(0, 28, 105, 14);
    Button3.setBackground(Color.cyan);
    }
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    //}
    }
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jin85
    1)come faccio a mettere in ogni cella i giorni corrispondenti al mese e all'anno voluto??la formattazione come faccio a farla, in modo da avere tutti i lunedì del mese sotto il tasto lunedì..tutti i martedì sotto il tasto martedì..e così via..
    Innanzitutto vedo che hai creato solo 5 righe ... però per certi mesi sono necessarie 6 righe. Non è un grosso problema ... magari poi te lo aggiusti.

    Per fare il calendario vero e proprio, devi per prima cosa stabilire quale è il giorno della settimana del 1º del mese e quanti giorni ci sono nel mese. Avevo già fatto un esempio, vedi la discussione che ti ho già sicuramente linkato da qualche parte.

    Nota che Calendar ti dà il giorno della settimana con i valori delle costanti SUNDAY, MONDAY ecc.... Solo che, attenzione, SUNDAY è 1, MONDAY è 2 ecc.... cioè parte da Domenica.
    Mentre nel tuo calendario parti all'inizio con Lunedì. Devi semplicemente shiftare il valore opportunamente in modo da avere alla fine: 0=Lunedì, 1=Martedì ecc.... Questo per motivi che ti spiegherò a breve.

    int giorno = (giornoDaCalendar + 5) % 7;

    Ora, immaginando di avere 6x7 celle = 42 celle, sarebbe molto comodo e utile avere un array di 42 elementi della tua classe che fa da "cella".

    Se ad esempio determini che il primo giorno del mese è Mercoledì (=2), bene, parti dall'indice 2 e vai avanti per N (numero dei giorni) elementi nel tuo array e per ogni cella imposterai il giorno con un metodo apposito es. celle[i].setGiorno(d) mentre le celle che non servono le puoi ad esempio nascondere.

    Nella tua cella metterai il giorno dove vuoi .... non ho capito bene se vuoi metterlo su uno dei 3 pulsanti o altro ...

    Originariamente inviato da jin85
    2)essendo la singola cella composta da tre bottoni...cm farò a visualizzare ad esempio il numero 1, corrispondente al giorno 1 del mese X (x sta per un mese qualsiasi)..cioè in poche parole..la label con il numero del giorno cm faccio a metterla??nn essendo un unico bottone..
    Mah ... è questo che non ho capito... Che hai 3 pulsanti per cella l'ho capito ... ma dove vuoi mettere il numero del giorno? Su uno dei pulsanti? Su tutti e 3 i pulsanti? Vuoi aggiungere alla cella una JLabel?? Puoi fare tutto quello che vuoi ... hai solo da deciderlo!

    Originariamente inviato da jin85
    3) ho un problema, quando vado a cliccare sulla combobox per scegliere il mese, questa si apre a cascata, però i bottoni "Lun" e "Mar" mi oscurano parte della visualizzazione a cascata..come si fa per far apparire la combobox in primo piano rispetto ai bottoni??
    Una delle principali cause è quando si usa un "mix" di componenti heavyweight (AWT) e lightweight (Swing), nel qual caso succedono appunto disastri di questo tipo.

    Ed è proprio .... il tuo caso ... per i pulsanti dei giorni hai istanziato dei Button (AWT) e non JButton (Swing).
    Evita questi mix .... please.


    P.S. Nel tuo sorgente ci sono diverse cose a mio avviso discutibili: il non uso dei layout manager (posizioni/dimensioni tu i componenti). Il SpinnerListModel creato con delle stringhe ... non era meglio usare degli Integer?? E altre piccoli particolari che almeno io personalmente avrei evitato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    Allora :

    -ho sistemato il JSpinner mettendo degli integer (cm comodità però erano più comode le string , x mettere degli int si fa un macello ..cmq era un giusto appunto il tuo).

    -ho sistemato anche il mix AWT e SWING, non me ne ero accorto minimamente..evito anch'io di fare questi mix..proprio perchè sapevo creavano problemi..

    -ho aggiunto anche la riga in più..

    -
    Mah ... è questo che non ho capito... Che hai 3 pulsanti per cella l'ho capito ... ma dove vuoi mettere il numero del giorno? Su uno dei pulsanti? Su tutti e 3 i pulsanti? Vuoi aggiungere alla cella una JLabel?? Puoi fare tutto quello che vuoi ... hai solo da deciderlo!
    voglio aggiungere una JLabel alla cella...ma poi i tre bottoni si vedrebbero comunque??nn vengono oscurati dalla JLabel??


    Oggi pomeriggio comincio a fare il calendario vero e proprio.. sperando di non incontrare problemi

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    Questo è il codice della jSpinner modificata per mettere interi..se a qualcuno dovesse servire

    Calendar calendar = new GregorianCalendar();
    int currentYear = calendar.get(Calendar.YEAR);
    SpinnerModel jSpinner1Model = new SpinnerNumberModel(currentYear,currentYear - 100,currentYear + 100,1);
    jSpinner1 = new JSpinner();
    jPanel1.add(jSpinner1);
    jSpinner1.setModel(jSpinner1Model);
    jSpinner1.setEditor(new JSpinner.NumberEditor(jSpinner1, "#"));
    jSpinner1.setBounds(441, 14, 98, 28);
    jSpinner1.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
    jSpinner1.getEditor().setBorder(new LineBorder(new java.awt.Color(0,0,0),1,false));
    jSpinner1.getEditor().setEnabled(false);

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.