View Full Version : [Java] - GridLayout con scrollbar
RagingBull
21-08-2008, 09:43
ciao a tutti!
avrei bisogno di posizionare in maniera tabellare (gridlayout) un numero aleatorio di checkbox.
Superato un certo limite queste checkbox vengono a sovrapporsi per mancanza di spazio.
Ho provato inserendo un JScrollPanel ma inevitabilmente questo viene posizionato in una delle celle di questa griglia.
Sto uscendo pazzo da ieri pomeriggio e non riesco a trovare la soluzione!
AIUTO!!!!:muro:
Grazie anticipatamente!!!
banryu79
21-08-2008, 10:47
Se puoi, posta il codice.
Probabilmente stai aggiungendo con .add() il JScrollPane dentro il Componente che ha come LayoutManager il GridLayout e quindi viene posizionato assieme alle tue JCheckBox.
Quello che invece devi fare è aggiungere il Componente dentro al JScrollPane, non viceversa.
Ipotizzo sia questo l'errore, ciao :)
banryu79
21-08-2008, 12:41
@EDIT:
se ti servono informazioni su come si usa uno Scroll Pane qui (http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html)trovi un'ottima introduzione (How to della Sun)
RagingBull
21-08-2008, 12:43
ciao, innanzitutto grazie per la risposta!
ho cercato di fare quello che mi hai detto ma ottengo vari errori....preferisco dunque postarti il codice così come stava: visualizzazione errata ma senza errori.
import java.awt.Checkbox;
import java.awt.GridLayout;
import javax.swing.*;
public class NewSwingApp extends javax.swing.JFrame {
private JScrollPane jScrollPane1;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewSwingApp inst = new NewSwingApp();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public NewSwingApp() {
super();
initGUI();
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
}
setLayout(new GridLayout(10, 5));
for(int i=0; i<=49; i++)
{
add(new Checkbox(""+i+""));
}
}
private void initGUI() {
try {
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
}
perdona l'eventuale sporcizia nel codice ma uso jigloo per le interfacce. si tratta di un progetto per l'università sono anche alle prime armi con java: capisci bene che la ricerca di un codice pulito mi farebbe perdere ulteriore tempo.
banryu79
21-08-2008, 12:58
ciao, innanzitutto grazie per la risposta!
import java.awt.Checkbox;
import java.awt.GridLayout;
import javax.swing.*;
public class NewSwingApp extends javax.swing.JFrame {
private JScrollPane jScrollPane1;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewSwingApp inst = new NewSwingApp();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public NewSwingApp() {
super();
initGUI();
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
}
setLayout(new GridLayout(10, 5));
for(int i=0; i<=49; i++)
{
add(new Checkbox(""+i+""));
}
}
private void initGUI() {
try {
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Il problema è che stai creando un JScrollPane che non "contiene" nulla [vedi chiamata al costruttore senza parametri, prima selezione in grassetto] ovvero nessun Component è client di quello scrollpane.
Inoltre l'oggetto per cui viene settato il LayoutManager e in cui vengono aggiunte le le checkBox è (implicitamente) il content pane di NewSwingApp, che è un JFrame [seconda e terza selezione in grassetto].
Per sistemare, io organizzerei i componenti interni al JFrame così:
- un JPanel dentro al (content pane del) JFrame;
- questo JPanel è il client del tuo JScrollPane [vedi link precedentement postato per come fare]
- il JPanel avrà come LayoutManager GridLayout;
- dentro al JPanel aggiungi le JCheckBox.
Inoltre sistemerei alcune cose nel codice che mi sembrano "poco pulite": per questo aspetto però posto più tardi che adesso devo scappare!
RagingBull
21-08-2008, 13:30
MITICO!!! Così funziona!!!
Se vedi qualcosa di strano fammi sapere: non vorrei problemi dell'ultimo minuto.
import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.GridLayout;
import javax.swing.*;
public class NewSwingApp2 extends javax.swing.JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewSwingApp2 inst = new NewSwingApp2();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public NewSwingApp2() {
super();
initGUI();
}
private void initGUI() {
JPanel p = new JPanel(new GridLayout(100,5));
JScrollPane sp = new JScrollPane(p);
for(int i=0; i<=499; i++)
{
p.add(new Checkbox(""+i+""));
}
add(sp, BorderLayout.CENTER);
this.setSize(400, 300);
}
}
banryu79
21-08-2008, 13:56
Mi sembra a posto adesso.
Solo una cosa che probabilmente già conosci: se vuoi che nella barra del titolo del tuo JFrame compaia una stringa ti basta passarla al costruttore di JFrame, nel tuo codice, dato che la tua classe eredita da JFrame, basta che passi la stringa come parametro a super(), qui:
public NewSwingApp2() {
super("Title of my application");
initGUI();
}
Ciao :)
RagingBull
21-08-2008, 14:43
Si quest'ultima cosa la sapevo. ;)
Grazie ancora per l'imbeccata. Se stavo ad aspettare jigloo c'avrei perso un'altra giornata!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.