Forum Informatica 2 Majorana
[JAVA]index del pulsante premuto in una serie di pulsanti - Versione stampabile

+- Forum Informatica 2 Majorana (http://www.istitutomajorana.it/forum2)
+-- Forum: Software per Ubuntu, Windows, ecc..., Argomenti Vari (http://www.istitutomajorana.it/forum2/Forum-Software-per-Ubuntu-Windows-ecc-Argomenti-Vari)
+--- Forum: Esempi di programmazione e macro (http://www.istitutomajorana.it/forum2/Forum-Esempi-di-programmazione-e-macro)
+--- Discussione: [JAVA]index del pulsante premuto in una serie di pulsanti (/Thread-JAVA-index-del-pulsante-premuto-in-una-serie-di-pulsanti)



[JAVA]index del pulsante premuto in una serie di pulsanti - patel - 05-10-2018

Il mio programma legge un file di testo con separatori, crea una serie di pulsanti a cui assegna una label e un testo da visualizzare in un textfield. Funziona tutto bene però io vorrei aggiungere la possibilità di modificare il contenuto del textfield ed aggiornare il file di testo originale, per far questo ho bisogno di conoscere l'indice del pulsante premuto in modo da modificare la lista di stringhe letta dal file. Però io non ho creato un array di pulsanti ma tanti pulsanti singoli e quindi non so come risolvere.
Questo il codice.
Codice:
private static int righe = 4;
   private static int colonne = 6;
   public ProvaFrame() {
      //
       String fileName= "appunti2.txt"; // STESSA CARTELLA
       File file= new File(fileName);
       //List<String> lines = new ArrayList<>();
       List<List<String>> lines = new ArrayList<>();
       Scanner inputStream;

       try{
           inputStream = new Scanner(file);

           while(inputStream.hasNext()){
               String line= inputStream.next();
               String[] values = line.split(",");
               // this adds the currently parsed line to the 2-dimensional string array
               lines.add(Arrays.asList(values));
           }

           inputStream.close();
       }catch (FileNotFoundException e) {
           e.printStackTrace();
       }
       initComponents();
       jPanel1.setLayout(new GridLayout( 1, 0)); // RIGHE,COLONNE
              JPanel buttonPanel = new JPanel();
       buttonPanel.setLayout(new GridLayout(righe, colonne, 2, 2)); // rige col gap1 gap2
       for(List<String> line: lines) {
           JButton button = new JButton(line.get(0)); // label del pulsante
           String comando = line.get(1); // stringa associata al pulsante
           button.setActionCommand(comando);
           button.addActionListener(new ActionListener()
               {
                   public void actionPerformed(ActionEvent ae)
                   {
                       JButton but = (JButton) ae.getSource();
                       jTextField2.setText(but.getActionCommand());  
// ------- inserimento nella clipboard -------------
                       StringSelection stringSelection = new StringSelection (but.getActionCommand());
                       Clipboard clpbrd = Toolkit.getDefaultToolkit ().getSystemClipboard ();
                       clpbrd.setContents (stringSelection, null);
                   }
               });
               buttonPanel.add(button);
       }
      jPanel1.add(buttonPanel);
   }



RE: [JAVA]index del pulsante premuto in una serie di pulsanti - BAT - 05-10-2018

il pulsante premuto è quello che ricavi dall'istruzione
JButton but = (JButton) ae.getSource();
per tenere traccia dell'ultimo pulsante premuto puoi definire come attributo di classe un JButton ultimoPremuto ed aggiungere alla actionPerformed l'istruzione JButton ultimoPremuto = but; // punta but

[EDIT]
nel precedente topic ti avevo suggerito di non usare una grglia di pulsanti ma una JList, in pratica una lista di elementi selezionabili con un click del mouse; le JList sono indicizzate, se ti servono delgi indici te li ritrovi gratis!


RE: [JAVA]index del pulsante premuto in una serie di pulsanti - patel - 06-10-2018

Avevo preso in considerazione la Jlist, ma io non desidero un menù a tendina ma una griglia di pulsanti con una certa struttura, vorrei soltanto creare un array di pulsanti in modo da gestirli con un indice.
Ci sono riuscito a creare l'array di pulsanti ma non so come ottenere l'index del pulsante premuto
Codice:
private static int righe = 4;
    private static int colonne = 6;
    JButton buttons[];
    public ProvaFrame() {
        String fileName= "appunti2.txt"; // STESSA CARTELLA
        File file= new File(fileName);
        //List<String> lines = new ArrayList<>();
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try{
            inputStream = new Scanner(file);

            while(inputStream.hasNext()){
                String line= inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }
            inputStream.close();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        buttons = new JButton[lines.size()]; // array di pulsanti
        initComponents();
        jPanel1.setLayout(new GridLayout( 1, 0)); // RIGHE,COLONNE
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(righe, colonne, 2, 2)); // righe col gap1 gap2
        
        for(int i = 0; i < lines.size(); i++) {
            buttons[i] = new JButton(lines.get(i).get(0));
            String comando = lines.get(i).get(1);
            buttons[i].setActionCommand(comando);
            buttons[i].addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent ae)
                    {
                        JButton but = (JButton) ae.getSource();
//                       int indice = ????????????????????????????????????????
                        jLabel1.setText(Integer.toString(indice));
                        jTextField2.setText(but.getActionCommand());  
                        StringSelection stringSelection = new StringSelection (but.getActionCommand());
                        Clipboard clpbrd = Toolkit.getDefaultToolkit ().getSystemClipboard ();
                        clpbrd.setContents (stringSelection, null);
                    }
                });
                buttonPanel.add(buttons[i]);
        }
       jPanel1.add(buttonPanel);
    }



RE: [JAVA]index del pulsante premuto in una serie di pulsanti - BAT - 06-10-2018

Cortesemente allegami il file appunti2.txt (modificando i dati privati, a me non interessa se scrivi "pippo" o "paperino" mi basta la struttura esatta del file;

per quanto riguarda l'indice l'unico modo (inefficiente) che mi viene in mente è:
usi un indice i per scandire buttons[i], ti basta verificare quale buttons[i]==sorgenteEvento e hai trovato l'indice


RE: [JAVA]index del pulsante premuto in una serie di pulsanti - patel - 06-10-2018

questa soluzione l'avevo pensata anche io e sarei capace di attuarla, ma come hai detto tu è inefficiente, non mi piace, ci deve essere un modo per carpire l'indice del pulsante cliccato, allego il file.

edit: ho letto della possibilità di usare putClientProperty, ho provato così:
Codice:
buttons[i].putClientProperty("indice", i);
            buttons[i].addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent ae)
                    {
                        JButton but = (JButton) ae.getSource();
                        String indice = (String) but.getClientProperty("indice");
                        jLabel1.setText(indice);
ma mi dà errore in compilazione


RE: [JAVA]index del pulsante premuto in una serie di pulsanti - patel - 06-10-2018

ho risolto con
Codice:
           buttons[i].putClientProperty("indice", i);
           buttons[i].addActionListener(new ActionListener()
               {
                   public void actionPerformed(ActionEvent ae)
                   {
                       JButton but = (JButton) ae.getSource();
                       int indice = (Integer) but.getClientProperty("indice");
                       jLabel1.setText(Integer.toString(indice));