Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Gestire JScrollPane

  1. #1

    Gestire JScrollPane

    Salve,

    vorrei sapere come si può far scendere automaticamente lo scroll nel momento in cui il testo immesso in un JPanel, superando le sue dimensioni, attiva appunto il JScrollPane che lo controlla!

    Sfogliando le API di java ho letto qualcosa riguardo il JViewport e il ChangeListener ma non ci ho capito molto!

    Di seguito posto un esempio che ho scritto e vorrei poter implementare qualcosa per poter avere l'effetto citato sopra!

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.swing.text.*;
    
    public class GestioneScroll extends JFrame{
    	
       	class Azione extends AbstractAction
        {
          	public void actionPerformed(ActionEvent e)
          	{
          		JLabel l = new JLabel(text.getText());
          		inserisci(l);
          	}
        }		
    	
    	Container frame;
    	JPanel livel0, messaggi;
    	JScrollPane scroll, scTx;
    	JTextArea text;
    	
    	//costruttore
    	public GestioneScroll()
    	{	
    		frame = getContentPane();
          	
          	livel0 = new JPanel();
          	livel0.setLayout(new BoxLayout(livel0, BoxLayout.Y_AXIS));
          	livel0.setPreferredSize(new Dimension(500, 500));
          	
          	messaggi = new JPanel();
          	messaggi.setLayout(new BoxLayout(messaggi, BoxLayout.Y_AXIS));
          	scroll = new JScrollPane(messaggi);
          	scroll.setPreferredSize(new Dimension(450, 300));
          	livel0.add(scroll);
          	
          	text = new JTextArea(4, 15);
          	text.setLineWrap(true);
          	
          	Keymap map = text.getKeymap();
          	map.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), new Azione());
          	
          	scTx = new JScrollPane(text);
          	scTx.setPreferredSize(new Dimension(450, 100));
          	livel0.add(scTx);
          	
          	frame.add(livel0);
          	
          	setSize(500, 500);
          	setTitle("Gestione Sroll");
         	setResizable(false);
          	setDefaultCloseOperation(EXIT_ON_CLOSE);
          	setVisible(true);
          	
    	}
    	
    	private void inserisci(JLabel ob)
    	{
        	messaggi.add(ob);
          	text.setText("");
          	setContentPane(livel0);
          	text.requestFocusInWindow();
        }
    
        public static void main(String[] args) 
        {
            GestioneScroll s = new GestioneScroll();
        }
    }

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    da How to Use Scroll Panes
    A scroll pane uses a JViewport instance to manage the visible area of the client. The viewport is responsible for positioning and sizing the client, based on the positions of the scroll bars, and displaying it.

    P.S.: scommetto che non segui il pensiero francescano

    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Se vuoi spostare programmaticamente la scrollbar di un JScrollPane, si può fare senza problemi. Prendi il JScrollBar dal JScrollPane e ne imposti il valore. L'avevo mostrato qui.

    Per il resto, vedo che aggiungi/modifichi componenti a seguito di eventi. Ricordati che se modifichi un container (aggiunta/rimozione ecc... di componenti), il container va validato, cosa che non vedo nel tuo codice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Per il resto, vedo che aggiungi/modifichi componenti a seguito di eventi. Ricordati che se modifichi un container (aggiunta/rimozione ecc... di componenti), il container va validato, cosa che non vedo nel tuo codice
    Scusa l'ignoranza, ma cosa intendi per "validazione" in questo caso?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    Scusa l'ignoranza, ma cosa intendi per "validazione" in questo caso?
    container.validate();

    E comunque dipende anche dal layout manager usato. Nel tuo caso (BoxLayout) il validate è sufficiente. Per esperienza personale ho avuto noie con GridBagLayout, dove sembra non basta un validate.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Allora il problema dello scroll l'ho risolto facendo come mi hai suggerito
    Adesso, sempre riguardo l'esempio che ho postato, in che modo posso mappare il tasto shift oltre al tasto invio? E' una cosa possibile?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    in che modo posso mappare il tasto shift oltre al tasto invio? E' una cosa possibile?
    Se vuoi mappare la sola pressione del tasto shift da solo puoi fare:

    keymap.addActionForKeyStroke (KeyStroke.getKeyStroke (KeyEvent.VK_SHIFT, InputEvent.SHIFT_DOWN_MASK), new TuaAction ());

    Nota che devi specificare VK_SHIFT per indicare il codice ma anche SHIFT_DOWN_MASK perché lo shift è al tempo stesso un "modificatore".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.