Scrollpane

Résolu
Tapatoudi Messages postés 12 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 9 février 2011 - 8 févr. 2011 à 16:58
Tapatoudi Messages postés 12 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 9 février 2011 - 9 févr. 2011 à 11:05
Voici mon petit problème

J'ai une application avec des boutons qui fonctionne ds un applet.

quand j'ajoute le code //scroll// ci-dessous, les boutons sont tjs là mais le contenu de la fenetre n'apparait plus.

I am thankful, agradecido, very reconnaissant enversla personne qui me dépannera.

voici le code de la page de tête:

public class fen_boutons extends JApplet {
//private JButton bouton = new JButton("Cliquez");
JButton bIter_0 = new JButton ("Placette initiale");
JButton bIter_1 = new JButton ("Une itération");
JButton bQuitter = new JButton ("Quitter");

dessin page = new dessin();

public void init() {

this.add(new des_boutons(page), "North");

// ajout code scroll
JPanel scrollContainer = new JPanel();
JScrollPane scroll = new JScrollPane(scrollContainer);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scroll);
// fin scroll

this.add(page , "Center");
}
}

6 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 févr. 2011 à 10:29
Salut,

Le fait que ton panel ne soit pas 'borné' à une importance dans la gestion des scroll avec ton ihm, il est donc important d'appeler la méthode setPreferredSize de ton objet dessin.

Je t'ai fait un petit exemple avec 2 boutons, un objet pour le dessin qui se trouve dans un JScrollPane et d'une classe pour les events :
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;

public class TestScroll extends JApplet {

private static final long	serialVersionUID	= 5422999913265609803L;
private JButton			buttonDraw		= null;
private JButton			buttonClear		= null;
private JCanvas			canvas			= null;

public void init() {
final JPanel contentPane = (JPanel) getContentPane();
final JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout(FlowLayout.LEFT));
buttons.add(getButtonDraw());
buttons.add(getButtonClear());

contentPane.add(buttons, BorderLayout.NORTH);

final JScrollPane scroll = new JScrollPane(getCanvas());
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

contentPane.add(scroll, BorderLayout.CENTER);

final ButtonActions actions = new ButtonActions(this);
getButtonClear().addActionListener(actions);
getButtonDraw().addActionListener(actions);
}

public JCanvas getCanvas() {
if (canvas == null) {
canvas = new JCanvas();
canvas.draw();// on fait un ptit paint pour la route
}
return canvas;
}

public JButton getButtonDraw() {
if (buttonDraw == null) {
buttonDraw = new JButton();
buttonDraw.setText("Draw");
}
return buttonDraw;
}

public JButton getButtonClear() {
if (buttonClear == null) {
buttonClear = new JButton();
buttonClear.setText("Clear");
}
return buttonClear;
}

}

class JCanvas extends JPanel {

private static final long		serialVersionUID	= 2875640105363885805L;
private static final Ellipse2D.Double 	CIRCLE 			= new Ellipse2D.Double(50, 50, 400, 400);
private boolean				clear			= true;

public JCanvas() {
// force le JScrollPane à recalculer la taille du viewport
// ici je me foule pas et j'utilise des valeurs fixes
setPreferredSize(new Dimension(800, 600));
}

public void paintComponent(final Graphics g) {
g.clearRect(0, 0, getWidth(), getWidth());
if (!clear) {
final Graphics2D g2 = (Graphics2D) g;
g2.setColor(new Color(0xFF, 0x00, 0x00, 0x7F));// rouge avec chanel
// alpha
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); // lissage de l'ellipse
g2.fill(CIRCLE);
g2.dispose();
}
}

public void draw() {
clear = false;
repaint();
}

public void clear() {
clear = true;
repaint();
}
}

class ButtonActions implements ActionListener {

private TestScroll	adaptee	= null;

public ButtonActions(final TestScroll adaptee) {
this.adaptee = adaptee;
}

public void actionPerformed(final ActionEvent e) {
final Object o = e.getSource();
SwingUtilities.invokeLater(new Runnable() {

public void run() {

if (o.equals(adaptee.getButtonDraw())) {
final JCanvas canvas = adaptee.getCanvas();
canvas.draw();
} else if (o.equals(adaptee.getButtonClear())) {
final JCanvas canvas = adaptee.getCanvas();
canvas.clear();
}
}
});
}

}








------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
8 févr. 2011 à 20:23
Salut,

je comprends pas trop ce que tu as voulu faire...
tu ajoutes l'objet des_boutons au nord de ton contentpane (ok)
tu ajoutes l'objet scroll (sans préciser de position ; par défaut au centre si je me trompe pas ; pourquoi pas)
tu ajoutes l'objet page au centre (ok mais ici tu écrases l'objet scroll...)

si ce que tu cherches à faire c'est de mettre l'objet page dans le scroll il faut modifier ton code comme suit :

public class fen_boutons extends JApplet {
//private JButton bouton = new JButton("Cliquez");
JButton bIter_0 = new JButton ("Placette initiale");
JButton bIter_1 = new JButton ("Une itération");
JButton bQuitter = new JButton ("Quitter");

dessin page = new dessin();

public void init() {

this.add(new des_boutons(page), "North");
this.add(new des_boutons(page), BorderLayout.NORTH); // plus lisible

// ajout code scroll
JPanel scrollContainer = new JPanel();
JScrollPane scroll = new JScrollPane(scrollContainer);
JScrollPane scroll = new JScrollPane(page); //ajout de page dans le scroll
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scroll);
this.add(scroll, BorderLayout.CENTER);
// fin scroll

this.add(page , "Center");
}
}




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Tapatoudi Messages postés 12 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 9 février 2011
8 févr. 2011 à 21:28
Merci, merci!

c'est déjà bcp mieux, reste que mes barres de défilements sont muettes ... ou plutôt sourdes, elles ne bougent rien !

et ma fenetre déborde largement de l'écran
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
8 févr. 2011 à 21:55
Salut,

tu fais quand dans la classe dessine ?




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tapatoudi Messages postés 12 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 9 février 2011
9 févr. 2011 à 07:57
Dans la classe dessin je fais appel à des méthodes 'iteration-x' qui calculent des coordonnées de points qui se déplacent au cours d'un certain nombre d'itérations

voila le code de cette classe

public class dessin extends JPanel {

private Color couleur = Color.green;
public final static Color couleurFond = Color.white;
private placette_iter P;

public dessin() {
BorderLayout.CENTER);
P = new placette_iter(100, 0, couleur);
}
public void paintComponent (Graphics g) {
super.paintComponent(g);
P.dessine(g);
// dessine le tableau final
this.repaint();
}

public void placette_initiale () {
P = new placette_iter(100, 0, Color.black);
}

public void iteration_1 () {
P = new placette_iter(100, 1, Color.white);
}

public void iteration_2 () {
P = new placette_iter(100, 2, Color.white);
}

public void iteration_3 () {
P = new placette_iter(100, 3, Color.white);
}
public void iteration_4 () {
P = new placette_iter(100, 4, Color.white);
}

public void iteration_20 () {
P = new placette_iter(100, 20, Color.white);
}

}
0
Tapatoudi Messages postés 12 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 9 février 2011
9 févr. 2011 à 11:05
Super! merci 10(x) fois

j'ai juste ajouté la ligne
setPreferredSize(new Dimension(800, 600));

et ça fonctionne!

Vous m'avez rendu un grand service, je buttais sur ce point technique et sans cela impossible de montrer tout le panneau (que je dois ajuster à 1100 x 1100) pour ma future présentation
0
Rejoignez-nous