PDA

Visualizza la versione completa : Problemaccio in java


GogetaSSJ4
03-11-2003, 18:34
Ragazzi stiamo :dhò: sbattendo la testa contro un muro da 2 giorni!!!
Stiamo svolgendo un progetto in Java e non riusciamo a far visualizzare una scrollbar.
Abbiamo un oggetto di tipo JTabbedPane di dimensioni maggiori rispetto alla finestra in cui viene visualizzato, quindi abbiamo pensato di aggiungere una scrollbar, ma non riusciamo a gestirla con un oggetto JTabbedPane.
Qualcuno di voi può darci una mano??? Se si, mandateci il codice sorgente di alcuni esempi.
Ciao ciao

anx721
03-11-2003, 23:36
Ciao, ho fatto al volo questo piccolo esempio con un JTabbedPane con 5 pannelli, inserito in un JScrollPane. Lo JScrollPane è aggiunto al JFrame e le barre si vedono. Ad ogni modo ho notato che le barre non si vedono se il JScrollPane viene aggiunto ad un pannello il cui layout è un FlowLayout. Se non sbaglio, il contentPane dei JFrame hanno impostato per default un BorderLayout e quindi la cosa funziona, se però provo ad impostare un FlowLayout le barre non si vedono. Quindi, almeno dalle prove che ho fattto ho capito che lo JScrollPane deve essere inserito in un pannello con un layout che non sia il FlowLayout. Bada quindi che se non inserisci lo JScrollPane direttaemnte al JFrame, ma lo inserisci in un altro JPanel p, e poi inserisci p al JFrame, devi impostare un BorderLayout su p, visto che i JPanel hanno per dafult un FlowLayout.

Ecco il codice:





import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Uffa extends JFrame{

public Uffa(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

setTitle("Uffa");
setSize(340, 340);
JTabbedPane tp = new JTabbedPane();

JPanel p1 = new JPanel();
p1.setLayout(new BorderLayout());
tp.add("uffa 1", p1);
p1.add(new JButton("uffa1"), "North");
p1.add(new JButton("uffa1"), "East");
p1.add(new JButton("uffa1"), "West");
p1.add(new JButton("uffa1"), "South");
p1.add(new JTextArea(15, 20), "Center");

JPanel p2 = new JPanel();
p2.setLayout(new BorderLayout());
tp.add("uffa 2", p2);
p2.add(new JButton("uffa2"), "North");
p2.add(new JButton("uffa2"), "East");
p2.add(new JButton("uffa2"), "West");
p2.add(new JButton("uffa2"), "South");
p2.add(new JTextArea(15, 15), "Center");

JPanel p3 = new JPanel();
p3.setLayout(new BorderLayout());
tp.add("uffa 3", p3);
p3.add(new JButton("uffa3"), "North");
p3.add(new JButton("uffa3"), "East");
p3.add(new JButton("uffa3"), "West");
p3.add(new JButton("uffa3"), "South");
p3.add(new JTextArea(15, 15), "Center");

JPanel p4 = new JPanel();
p4.setLayout(new BorderLayout());
tp.add("uffa 4", p4);
p4.add(new JButton("uffa4"), "North");
p4.add(new JButton("uffa4"), "East");
p4.add(new JButton("uffa4"), "West");
p4.add(new JButton("uffa4"), "South");
p4.add(new JTextArea(15, 15), "Center");

JPanel p5= new JPanel();
p5.setLayout(new BorderLayout());
tp.add("uffa 5", p5);
p5.add(new JButton("uffa5"), "North");
p5.add(new JButton("uffa5"), "East");
p5.add(new JButton("uffa5"), "West");
p5.add(new JButton("uffa5"), "South");
p5.add(new JTextArea(15, 15), "Center");

getContentPane().add(new JScrollPane(tp));

setLocation(0, 0);
validate();
show();
}

public static void main(String[] args){
new Uffa();
}



Ciao.

GogetaSSJ4
04-11-2003, 14:27
Grazie per averci risposto, ma sai abbiamo omesso il fatto che i nostri pannelli sono dinamici..per cui il tuo codice non si adatta al nostro. potresti per favore darci ancora una mano???
ora ti spiego: i pannelli sono generati per mezzo di un ciclo for che parte da 1 a n (n indefinito,lo decido io sul momento). un'altra cosa.. non aggiungiamo gli elementi nel JPanel con "add" ma abbiamo dovuto usare il metodo "addTab" ..visto che è l'unica cosa che differisce dal tuo codice, sarà questa a crearci dei problemi?

grazie

anx721
04-11-2003, 22:38
Il fatto che i pannellli li aggiungi in modo dinamico non ha alcuna influenza, anche il metodo addTab non dà problemi, ad ogni modo, dov'è che aggiungi il JScrollPane che contiene il JTabbedPane? Lo aggiungi come ti ho consigliato ad un pannello che NON abbia il FlowLayout? E' questo l'unico caso in cui a me non si vedono le barre, quindi è questo che devi accertarti. Se non riesci a risolvere puoi provare a mandarmi il codice, ciao.

GogetaSSJ4
05-11-2003, 17:39
Ciao innanzi tutto ti ringraziamo per la disponibilità. Ci sembra di aver seguito i tuoi consigli ma non abbiamo ottenuto risultati; perciò ti inviamo il pezzo di codice del file in cui deve essere inserita la scrollbar(focalizza l'attenzione dalla riga 67 alla 93). Le variabili che ti sembrano non dichiarate, sono in realtà globali, come tabella che è di tipo JTabbedPane, ma in un altro frammento di codice che non ti abbiamo mandato poichè inutili per la risoluzione del nostro problema.
Ti saremo grati se ci invierai il codice modificato.
Grazie ancora.

import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;



class Disegno extends JFrame{

public Disegno(String[] scenari,int dataSize){
super("MSCs");
setSize(600,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);



iconsLine = new ImageIcon(iconLine);
buttonsLine = new JButton(iconsLine);
buttonsLine.setToolTipText(buttonLine);
toolBar.add(buttonsLine);
buttonsLine.addActionListener(new MenuListener());


iconsLoop = new ImageIcon(iconLoop);
buttonsLoop = new JButton(iconsLoop);
buttonsLoop.setToolTipText(buttonLoop);
toolBar.add(buttonsLoop);
buttonsLoop.addActionListener(new MenuListener());


iconsComp = new ImageIcon(iconComp);
buttonsComp = new JButton(iconsComp);
buttonsComp.setToolTipText(buttonComp);
toolBar.add(buttonsComp);
buttonsComp.addActionListener(new MenuListener());


iconsMess = new ImageIcon(iconMess);
buttonsMess = new JButton(iconsMess);
buttonsMess.setToolTipText(buttonMess);
toolBar.add(buttonsMess);
buttonsMess.setEnabled(false);
buttonsMess.addActionListener(new MenuListener());

tabella = new JTabbedPane();
hMSCpanel = new PanelhMSC();

int x = 0;
int k = 0;
for(i=0; i<dataSize; i++){
if(i != 0) k = 180;
x = x + k;
ret = new Rectangle(x, 100, EGG_WIDTH, EGG_HEIGHT);
rettangoli[i] = ret;

}
//aggiunge l'intercettatore del muose
MouseHandler list = new MouseHandler();
hMSCpanel.addMouseListener (list);
MouseMotionHandler listener = new MouseMotionHandler();
hMSCpanel.addMouseMotionListener (listener);

pannelli[0] = hMSCpanel;

//riga 67
for(i=1; i <= dataSize; i++) {
JPanel pannello = new JPanel();
pannello.setLayout(new BorderLayout());
pannelli[i] = pannello;
}

for(int i=1; i <= dataSize; i++) {
PanelbMSC pannello2 = new PanelbMSC();
pannello2.setLayout(new BorderLayout());
pannelli[i] = pannello2;
}


for(i=0; i <= dataSize; i++) {
pannelli[i].setBackground(Color.white);

tabella.addTab(scenari[i],null,pannelli[i] );
getContentPane().add(new JScrollPane(tabella));

}
getContentPane().add("North",toolBar);
setLocation(0, 0);
validate();
show();

}
}

anx721
05-11-2003, 23:12
Ho provato ad utilizzare il cilo for in cui aggiungi dinamicamente i pannelli a tabella, però non avendo il resto del codice ci ho aggiunto semplicemente dei JPanel, mentre tu ci aggiungi dei PanelbMSC, che non so come sono fatti. Ad ogni modo c'è sicuramente un errore nel ciclo for:

for(i=0; i <= dataSize; i++) {
pannelli[i].setBackground(Color.white);

tabella.addTab(scenari[i],null,pannelli[i] );
getContentPane().add(new JScrollPane(tabella));

}

In questo modo ad ogni iterazione che fai aggiungi al frame un nuovo JScrollPane con tabella, mentre dovresti aggiungerla solo alla fine, all'esterno del for:

for(i=0; i <= dataSize; i++) {
pannelli[i].setBackground(Color.white);
tabella.addTab(scenari[i],null,pannelli[i] );
}
getContentPane().add(new JScrollPane(tabella));

Quest'errore nel mio esempio non impediva comuque la visualizzazione delle barre, ad ogni modo ricordo che con qualche versione del JDK precedente all'1.4.2 si avevano problemi se si aggiungeva più volte lo stesso componente ad un pannello, quindi aggiusta comuqnue il codice.

Tra l'altro non capisco perchè fai prima un ciclo for in cui inizializzi pannelli[i] con un nuovo JPanel e poi fai un altro ciclo in cui assegni a pannelli[i] un nuovo PanelbMSC, che senso ha allora fare il primo for?

Ad ogni modo tieni presente che le barre diventatno visibili se il componente contenuto nel JScrollPane è di dimensione maggiore rispetto all'aria visibile. In questo caso nel JScrollPane è contenuta tabella, la cui dimensione è a sua volta determinata dalla dimensione massima dei pannelli aggiunti a tabella, quindi bisonga verificare che tale dimensione sia sufficiente. Fai tra l'altro questa prova: una volta avviata l'applicazione prova a rimpicciolire la finestra trascinando i bordi, e vedi se a un certo punto (magari quando la finestra è molto piccola) le barre appaiono o no. Altri suggerimenti non te li so dare non avendo il codi ce delle altre classi sottomano, ciao.

Loading