PDA

View Full Version : [Java] JScrollPane e SpringLayout


hee136
10-02-2011, 09:01
Se inserisco un pannello JScrollPane in un altro pannello che utilizza uno SpringLayout, non mi compaiono più le barre di scorrimento.
Questo non succede se il pannello in cui inserisco JScrollPane utilizza un altro layout.

hee136
10-02-2011, 09:01
La versione con SpringLayout non corretta


Container contentPane = getContentPane();
JScrollPane scrollbar;
JButton pulsante = new JButton("premi");
JButton pulsante2 = new JButton("premi 2");
SpringLayout layout = new SpringLayout();
int righe = 160;
GridLayout layout2 = new GridLayout(righe,1);
JPanel pane = new JPanel();
pane.setLayout(layout2);
JPanel pane2 = new JPanel();
pane2.setLayout(layout);
JCheckBox cb = new JCheckBox("campo 0");
for (int i=1;i<righe;i++) {
cb = new JCheckBox("campo "+i);
pane.add(cb);
}
scrollbar = new JScrollPane(pane);
pane2.add(pulsante2);
layout.putConstraint(SpringLayout.WEST, pulsante2, 10, SpringLayout.WEST, contentPane);
pane2.add(scrollbar);
layout.putConstraint(SpringLayout.WEST, scrollbar, 50, SpringLayout.EAST, pulsante2);
pane2.add(pulsante);
layout.putConstraint(SpringLayout.WEST, pulsante, 50, SpringLayout.EAST, pulsante2);
this.add(pane2);

hee136
10-02-2011, 09:02
La versione con SpringLayout non corretta


Container contentPane = getContentPane();
JScrollPane scrollbar;
JButton pulsante = new JButton("premi");
JButton pulsante2 = new JButton("premi 2");
SpringLayout layout = new SpringLayout();
int righe = 160;
GridLayout layout2 = new GridLayout(righe,1);
JPanel pane = new JPanel();
pane.setLayout(layout2);
JPanel pane2 = new JPanel();
pane2.setLayout(layout);
JCheckBox cb = new JCheckBox("campo 0");
for (int i=1;i<righe;i++) {
cb = new JCheckBox("campo "+i);
pane.add(cb);
}
scrollbar = new JScrollPane(pane);
pane2.add(pulsante2);
layout.putConstraint(SpringLayout.WEST, pulsante2, 10, SpringLayout.WEST, contentPane);
pane2.add(scrollbar);
layout.putConstraint(SpringLayout.WEST, scrollbar, 50, SpringLayout.EAST, pulsante2);
pane2.add(pulsante);
layout.putConstraint(SpringLayout.WEST, pulsante, 50, SpringLayout.EAST, pulsante2);
this.add(pane2);


Screenshot:

http://img585.imageshack.us/img585/62/schermataz.png

hee136
10-02-2011, 09:03
Versione con GridLayout corretta:


Container contentPane = getContentPane();
JScrollPane scrollbar;
JButton pulsante = new JButton("premi");
JButton pulsante2 = new JButton("premi 2");
GridLayout layout = new GridLayout(1,3);
int righe = 160;
GridLayout layout2 = new GridLayout(righe,1);
JPanel pane = new JPanel();
pane.setLayout(layout2);
JPanel pane2 = new JPanel();
pane2.setLayout(layout);
JCheckBox cb = new JCheckBox("campo 0");
for (int i=1;i<righe;i++) {
cb = new JCheckBox("campo "+i);
pane.add(cb);
}
scrollbar = new JScrollPane(pane);
pane2.add(pulsante2);
pane2.add(scrollbar);
pane2.add(pulsante);
this.add(pane2);


Screenshot:

http://img39.imageshack.us/img39/3545/schermataag.png

hee136
10-02-2011, 12:55
Ho anche provato a mettere un pannello in mezzo ma non cambia niente.

PGI-Bis
10-02-2011, 14:32
Che dire, nel codice c'è un'interpretazione delle capacità di SpringLayout che denota senonaltro un certo spirito d'avventura. Insomma, un plauso al tentativo.

Ecco cosa non va.

Il layout opera rispetto al contenitore a cui è applicato e al contenuto di quel contenitore.

Tu applichi il layout a pane2 e definisci un vincolo con contentPane. contentPane non è pane2 nè un componente contenuto in pane2. Devi usare "pane2" al posto di "contentPane".

Il perchè è evidente quando inseriamo i pezzi mancanti - che fanno sì che il JScrollPane non sprofondi sotto la scrivania: parlo dei vincoli tra il bordo inferiore del contenitore (pane2) e il bordo inferiore del più alto dei componenti in esso contenuti e tra il bordo destro del contenitore (sempre pane2) e il bordo destro del componente più a destra, sempre contenuto nello stesso contenitore.

Ad esempio:

package test;

import java.awt.GridLayout;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SpringLayout;
import static javax.swing.SpringLayout.*;

public class Main {

public static void main(String[] args) throws IOException {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
Main.start();
}
});
}

private static void start() {
JFrame window = new JFrame();
int righe = 160;
JPanel pane = new JPanel(new GridLayout(righe, 1));
for(int i = 0; i < righe; i++) pane.add(new JCheckBox("Box " + (i + 1)));
JScrollPane scrollpane = new JScrollPane(pane);

JButton pulsante1 = new JButton("premi");
JButton pulsante2 = new JButton("premi 2");
SpringLayout layout = new SpringLayout();
JPanel springPanel = new JPanel(layout);
springPanel.add(pulsante2);
springPanel.add(scrollpane);
springPanel.add(pulsante1);

layout.putConstraint(NORTH, pulsante2, 10, NORTH, springPanel);
layout.putConstraint(WEST, pulsante2, 10, WEST, springPanel);
layout.putConstraint(WEST, scrollpane, 10, EAST, pulsante2);
layout.putConstraint(NORTH, scrollpane, 10, NORTH, springPanel);
layout.putConstraint(NORTH, pulsante1, 10, NORTH, springPanel);
layout.putConstraint(WEST, pulsante1, 10, EAST, scrollpane);
layout.putConstraint(SOUTH, springPanel, 10, SOUTH, scrollpane);
layout.putConstraint(EAST, springPanel, 10, EAST, pulsante1);
layout.putConstraint(SOUTH, pulsante2, 0, SOUTH, scrollpane);
layout.putConstraint(SOUTH, pulsante1, 0, SOUTH, scrollpane);

window.add(springPanel);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.setSize(640, 480);
window.setVisible(true);
}
}


Risulta:

http://www.tukano.it/images/screenshot.png

hee136
11-02-2011, 09:22
Che dire, nel codice c'è un'interpretazione delle capacità di SpringLayout che denota senonaltro un certo spirito d'avventura. Insomma, un plauso al tentativo.


Ti ringrazio dell'aiuto.
Ti posso invece chiedere maggiori spiegazioni sulla frase sopra?

PGI-Bis
11-02-2011, 11:58
E' un encomio. SpringLayout è poco usato per la creazione manuale di interfacce - di norma si usa la composizione di layout più semplici per ottenere effetti analoghi - quindi è un ottimo candidato per le richieste d'aiuto del genere "non ci capisco una mazza e non ci provo neanche". Al contrario mi sembra che tu ci abbia provato, cercando di piegare uno degli esempi dei tutorial di Sun alle tue esigenze. E' positivo, uno non riesce mai a comunicare abbastanza quanto l'esperienza della programmazione sia un continuo tentare di.