Newsgroup: it.comp.java
Titolo: JTextPane che non scrolla orizzontalmente

Dovrei utilizzare uno JTextPane che deve scorrere orizzontalmente e
verticalmente.
Se faccio:
JTextPane text=new JTextPane();
JScrollPane scroll=new JScrollPane(text);
panel.add(scroll);
il testo scorre solo verticalmente e una volta arrivato alla fine della riga
va a quella successiva e non permette di scrollare orizzontalmente.
come posso fare?
Ho provato anche ad utilizzare un JViewport in aggiunta ma le cose non
cambiano, però funziona con una JTextArea, ma a me serve una JTextPane.
HELP!!

 come posso fare?
Un JTextPane è settato per scrollare, quando inserito in un JScrollPane,
verticalmente di default, ma non orizzontalmente. Questo perché per questo
tipo di componente è desiderabile un wordwrap automatico e raramente è
necessario il contrario. Esiste tuttavia un modo per disabilitare il
wordwrap e permettere lo scrolling orizzontale. Ecco come bisogna fare:
1) derivare da JTextPane un proprio componente, chiamiamolo ad esempio
HSJTextPane
2) ridefinire il metodo getScrollableTracksViewportWidth() facendogli
ritornare false anziché true come accade di default
Il codice che implementa quanto detto è il seguente (per completezza vengono
ridefiniti entrambi i costruttori di JTextPane):
class HSJTextPane extends JTextPane
{
HSJTextPane()
 {
  super();
 }
HSJTextPane(StyledDocument sd)
 {
  super(sd);
 }
 public boolean getScrollableTracksViewportWidth()
 {
  return(false);
 }
}
...
HSJTextPane textPane = new HSJTextPane();
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(200, 200));
...
Vedrai che HSJTextPane() non farà più wordwrap e scrollerà orizzontalmente
(non a caso HSJTextPane sta per Horizontal Scrolling JTextPane... 8-) )
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.

 wrote in message
t5299rc...@corp.supernews.com...


 Come posso risolvere questo fatto?
Fare diagnosi alla cieca non è semplice. Potresti postare la parte di codice
incriminato?


 wrote in message
t54kia2...@corp.supernews.com...


> Ho utilizzato il codice che mi hai detto tu:
Ops, hai ragione! Nella fretta ho dimenticato un "pezzo": nella classe
HSJTextPane devi ridefinire anche il metodo setBounds che viene chiamato da
JScrollPane per adattare le dimensioni del suo contenuto secondo necessità.
Ecco il metodo mancante:
public void setBounds(int x, int y,int width, int height)
{
    super.setBounds(x ,y,Math.max(minimumWidth, width),height);
}
minimumWidth, che puoi aggiungere come attributo alla classe e gestire
tramite metodi di accesso set/get (vedi sotto), rappresenta la larghezza
minima del HSJTextPane.
Aggiungo una "finezza". Ridimensionando (ed in particolare allargando) il
JFrame che contiene l'applicazione è probabile che, in dipendenza del
LayoutManager scelto, anche il JScrollPane venga ridimensionato. In quel
caso potrebbe rimanere scoperta (e quindi riempita del colore di sfondo,
grigio di default) una parte della JViewport dello JScrollPane perché il
HSJTextPane in essa contenuto non viene sempre anch'esso ridimensionato
automaticamente. In pratica l'HSJTextPane finisce per non coprire più tutta
l'area del contenuto (JViewport) dello JScrollPane, lasciando un bordo
scoperto a destra.
Per fare in modo che il HSJTextPane venga ridimensionato in modo da occupare
comunque tutta la JViewport di JScrollPane e non lasciare bordi scoperti, è
necessario intercettare l'evento di ridimensionamento della JViewport ed in
esso ridimensionare anche HSJTextPane.
Ti riporto la versione di HSJTextPane riveduta e corretta:
class HSJTextPane extends JTextPane
{
 int minimumWidth ;
 HSJTextPane(StyledDocument sd)
 {
  super(sd);
  minimumWidth = 0 ;
 }
 HSJTextPane()
 {
  super();
  minimumWidth = 0 ;
 }
 public boolean getScrollableTracksViewportWidth()
 {
  return(false);
 }
 public void setMinimumWidth(int minWidth)
 {
  minimumWidth = minWidth ;
  setBounds(getX(), getY(), getWidth(), getHeight());
 }
 public void setBounds(int x, int y,int width, int height)
   {
     super.setBounds(x,y,Math.max(minimumWidth, width),height);
    }
}
dove è stato aggiunto il metodo di acesso setMinimumWidth(). Se dovesse
servire provvedi tu al duale getMinimumWidth().
Esempio di utilizzo:
HSJTextPane textPane = new HSJTextPane();
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(200, 200));
// gestore dell'evento di ridimensionamento della viewport
scrollPane.getViewport().addComponentListener(new ComponentAdapter()
{
     public void componentResized(ComponentEvent e)
     {
         textPane.setMinimumWidth(((JViewport)e.getComponent()).getWidth());
      }
});
Come vedi il gestore dell'evento di ridimensionamento chiama
setMinimumWidth() che a sua volta chiama setBounds(). Eventualmente puoi
derivare una versione specializzata di JScrollPane per contenere un
HSJTextPane e che gestisca già l'evento di ridimensionamento.
E' tutto, mi scuso ancora per la svista.


 wrote in message
t56o4gd...@corp.supernews.com...
