Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    [Java] Modo migliore per ricevere eventi su JTextPane

    Ciao a tutti.

    Sto utilizzando un KeyPressed() per ricevere gli eventi di pressione dei tasti, ma come mi è stato suggerito da andbin in un altro post non è il massimo.
    Quale devo utilizzare per avere anche le combinazioni di tasti ad esempio con CTRL?


    PS: sto utilizzando anche un DocumentListener per "ascoltare" ogni pressione in modo da cambiare colore alla "linguetta" del JTabbedPane..comunque questo non centra nulla con le combinazioni dei tasti nella JTextPane penso :P


    Grazie a tutti!

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

    Re: [Java] Modo migliore per ricevere eventi su JTextPane

    Originariamente inviato da Patrick Jane
    Sto utilizzando un KeyPressed() per ricevere gli eventi di pressione dei tasti, ma come mi è stato suggerito da andbin in un altro post non è il massimo.
    Quale devo utilizzare per avere anche le combinazioni di tasti ad esempio con CTRL?
    Tecnicamente sempre con keyPressed(). Solo che la questione è più particolare, perché i vari Ctrl, Alt ecc.. sono dei "modificatori" trattati in modo più specifico.

    Se come sequenza fai: premo Ctrl, premo A, rilascio A, rilascio Ctrl, tecnicamente ottieni come invocazioni:

    keyPressed con e.getKeyCode() = VK_CONTROL
    keyPressed con e.getKeyCode() = VK_A
    keyReleased con e.getKeyCode() = VK_A
    keyReleased con e.getKeyCode() = VK_CONTROL

    E i keyPressed si possono ripetere se tieni premuto, ovviamente.

    Se devi solo "sentire" il tasto Ctrl (come se fosse un qualunque altro tasto), lo tratti nei metodi sopra come "key code".
    Se devi trattarlo come "modificatore" di un altro tasto, non devi tenerti tu nessun "flag" perché avevi trovato il VK_CONTROL prima! Infatti KeyEvent ha i metodi:

    - isControlDown() / isAltDown() / ecc.... isXXXDown()
    - getModifiers() / getModifiersEx() per ottenere le combinazioni di flag relative a pulsanti del mouse e modificatori Ctrl ecc...

    Originariamente inviato da Patrick Jane
    sto utilizzando anche un DocumentListener per "ascoltare" ogni pressione
    Per essere precisi, con DocumentListener non senti di per sé le pressioni dei tasti .... ricevi notifica delle modifiche, in generale, al Document, che possono avvenire in svariati modi: digitazione dell'utente, azione di "incolla", modifica da codice direttamente sul Document o attraverso il componente di testo (es. setText() ecc...).
    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
    Dec 2009
    Messaggi
    1,123

    Re: Re: [Java] Modo migliore per ricevere eventi su JTextPane

    Originariamente inviato da andbin
    Tecnicamente sempre con keyPressed(). Solo che la questione è più particolare, perché i vari Ctrl, Alt ecc.. sono dei "modificatori" trattati in modo più specifico.

    Se come sequenza fai: premo Ctrl, premo A, rilascio A, rilascio Ctrl, tecnicamente ottieni come invocazioni:

    keyPressed con e.getKeyCode() = VK_CONTROL
    keyPressed con e.getKeyCode() = VK_A
    keyReleased con e.getKeyCode() = VK_A
    keyReleased con e.getKeyCode() = VK_CONTROL

    E i keyPressed si possono ripetere se tieni premuto, ovviamente.

    Se devi solo "sentire" il tasto Ctrl (come se fosse un qualunque altro tasto), lo tratti nei metodi sopra come "key code".
    Se devi trattarlo come "modificatore" di un altro tasto, non devi tenerti tu nessun "flag" perché avevi trovato il VK_CONTROL prima! Infatti KeyEvent ha i metodi:

    - isControlDown() / isAltDown() / ecc.... isXXXDown()
    - getModifiers() / getModifiersEx() per ottenere le combinazioni di flag relative a pulsanti del mouse e modificatori Ctrl ecc...

    Per essere precisi, con DocumentListener non senti di per sé le pressioni dei tasti .... ricevi notifica delle modifiche, in generale, al Document, che possono avvenire in svariati modi: digitazione dell'utente, azione di "incolla", modifica da codice direttamente sul Document o attraverso il componente di testo (es. setText() ecc...).
    Grazie per la risposta!

    E per gestire le "scorciatoie da tastiera" sui JMenuItem? Devo solamente creare il JMenuItem e passare al costruttore la costante?

    Ho anche un altra domanda, ho fatto in modo, come detto sopra, che ad ogni digitazione nel JTextPane il colore della "linguetta" (o per meglio dire, del testo della linguetta) diventi rosso. Non ho trovato delle vere e proprie guide da seguire, per cui mi sono rivolto al tutorial della Sun e alla descrizione della classe..sta di fatto che ci ho capito poco..e nel metodo insertString() ho fatto quanto segue:

    codice:
    document.insertString(document.getLength()," ",document.getStyle("color"));
    Come si evince, in questo modo, ad ogni selezione del colore viene lasciato uno spazio.. c'è un modo per evitarlo?
    Per lo stile grassetto, ho scritto questo invece:

    codice:
    private void addStylesToDocument(StyledDocument document, String format) {
      try {
        Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
        Style s = document.addStyle("Bold",def);
    	  
        StyleConstants.setBold(s,true);
        document.insertString(document.getLength()," ",document.getStyle("Bold"));
        ed.getPane().setCaretPosition(document.getLength());
      } catch(BadLocationException ex) {}
    }
    da quello che sono riuscito a capire (e che immagino)
    codice:
    StyleConstants.setBold(s,true);
    sostituendo il "true" con "false", farei in modo che il testo torni senza il grassetto.
    La domanda è.. come faccio a far in modo che, alla prima pressione del bottone "Grassetto" il testo diventi grassetto (quindi true), e alla pressione successiva diventi "false"?

    PS: Ho visto i metodi isBold() ecc. penso facciano al caso mio.. solo che non ho capito bene come usarli.

    Grazie mille!!

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

    Re: Re: Re: [Java] Modo migliore per ricevere eventi su JTextPane

    Originariamente inviato da Patrick Jane
    E per gestire le "scorciatoie da tastiera" sui JMenuItem?
    Intendi i "mnemonics" o gli "acceleratori"??
    Comunque vedi Enabling Keyboard Operation che li spiega.

    Originariamente inviato da Patrick Jane
    codice:
    document.insertString(document.getLength()," ",document.getStyle("color"));
    Come si evince, in questo modo, ad ogni selezione del colore viene lasciato uno spazio.. c'è un modo per evitarlo?
    insertString() serve per inserire "qualcosa" nel document. Se fai l'insert di uno spazio e mi dici "non voglio lo spazio" .... quale è il senso allora di questo inserimento?

    Originariamente inviato da Patrick Jane
    La domanda è.. come faccio a far in modo che, alla prima pressione del bottone "Grassetto" il testo diventi grassetto (quindi true), e alla pressione successiva diventi "false"?

    PS: Ho visto i metodi isBold() ecc. penso facciano al caso mio.. solo che non ho capito bene come usarli.
    No, io direi che stai andando un po' fuori strada.
    Prova questo semplice programmino:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    
    public class TestFrame extends JFrame {
        public TestFrame() {
            super("Test Frame");
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(600, 400);
    
            JTextPane textPane = new JTextPane();
            JScrollPane scrollPane = new JScrollPane(textPane);
    
            JButton redColorButton = new JButton(new MyForegroundAction("Colore rosso", Color.RED));
            JButton greenColorButton = new JButton(new MyForegroundAction("Colore verde", Color.GREEN));
            JButton blueColorButton = new JButton(new MyForegroundAction("Colore blu", Color.BLUE));
    
            JPanel buttonsPanel = new JPanel(new GridLayout(1, 0));
            buttonsPanel.add(redColorButton);
            buttonsPanel.add(greenColorButton);
            buttonsPanel.add(blueColorButton);
    
            getContentPane().add(buttonsPanel, BorderLayout.NORTH);
            getContentPane().add(scrollPane, BorderLayout.CENTER);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TestFrame f = new TestFrame();
                    f.setVisible(true);
                }
            });
        }
    }
    
    
    class MyForegroundAction extends StyledEditorKit.ForegroundAction {
        public MyForegroundAction(String testo, Color colore) {
            super(testo, colore);
        }
    
        public void actionPerformed(ActionEvent e) {
            super.actionPerformed(e);
    
            // Tutto questo (la estensione di StyledEditorKit.ForegroundAction)
            // principalmente solo per poter ridare il focus.
            JTextComponent textComp = getTextComponent(e);
            if (textComp != null) {
                textComp.requestFocusInWindow();
            }
        }
    }
    Prova a fare le seguenti cose:
    1) Scrivi del testo, poi seleziona una porzione e clicca su uno dei pulsanti. Togli ovviamente la selezione (altrimenti non vedi il colore) e vedrai che ha cambiato colore a quella porzione.

    2) Metti il caret in un certo punto, qualunque colore ci sia in quel punto, se premi uno dei pulsanti e poi inizi a scrivere, scrive con quel colore che hai appena selezionato.

    Quelle "action" in StyledEditorKit (parlo della ForegroundAction e delle svariate altre) sono fatte apposta per cose di questo tipo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    ciao!
    Ho qualche domanda sul tuo programmino qui sopra ^^

    Ho una difficoltà.. scelgo il colore da una Dialog con JColorChooser.. ma l'oggetto della classe che estende StyledEditorKit, come lo uso? (cioè come coloro il testo successivo o quello selezionato nel JTextPane?)

    Grazie!!

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.