Utiliser une disposition absolue à l'intérieur d'un JScrollPane
J'ai besoin d'utiliser un JScrollPane, avec une absolue layoute. Je sais que l'utilisation de setLayout(null) n'est pas recommandable à tous. J'ai lu que si vous souhaitez utiliser la disposition absolue avec un JScrollPane, il est nécessaire de définir la taille par défaut de la propriété des éléments à l'intérieur afin de JScrollPane peut calculer sa taille.
J'ai essayé le code suivant dans la modification de l'ordre et les tailles des elemnts mais je ne peux pas savoir où j'ai eu tort.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class frame extends JFrame {
private JPanel contentPane;
private JScrollPane scrollPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame frame = new frame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public frame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(null);
setContentPane(contentPane);
JPanel panel = new JPanel();
panel.setBackground(Color.red);
panel.setBounds(0,0,600,600);
panel.setPreferredSize(new Dimension(420,280));
scrollPane = new JScrollPane(panel);
scrollPane.setBounds(0, 0, 600, 600);
scrollPane.setLayout(null);
scrollPane.setBackground(Color.green);
scrollPane.add(panel);
scrollPane.setPreferredSize(new Dimension(450,300));
contentPane.add(scrollPane);
}
}
Pourquoi setPreferredSize n'est pas de faire le droit du travail?
Merci à l'avance.
- Voir aussi
ScrollPanePaint
. - a) jamais utiliser un null Mise en page (aka: pas de LayoutManager) b) ne jamais-jamais utiliser setXXSize
Vous devez vous connecter pour publier un commentaire.
Modification de la disposition du gestionnaire du réel
JScrollPane
n'a pas de sens; si vous souhaitez utiliser la disposition absolue au sein de votre application, vous devez généralement appelersetLayout(null)
sur une classe de conteneur (commeJPanel
) afin de positionner les composants enfants à l'intérieur à l'aide d'un positionnement absolu.Je suggère que vous devriez essayer:
setLayout(null)
sur leJPanel
contenues dans leJScrollPane
(comme je l'ai pense c'est ce que vous essayez de le faire).JPanel
directement, sous-classe et votre sous-classe de mettre en œuvre laScrollable
interface, qui fournit des informations supplémentaires à l'JScrollPane
concernant le meilleur déroulante taille de la fenêtre.Tout d'abord, ne pas changer le layout manager du panneau défilant, il n'est pas nécessaire pour ce que vous voulez atteindre
Deuxième, faites défiler le volet fonctionne bien un
JViewport
. Vous devez ajouter votre conteneur à la place (scrollPane.add(panel)
est la mauvaise chose à faire), au lieu d'utiliserscrollPane.setViewportView(panel)
Troisièmement, vous voulez prendre un coup d'oeil à la Défilement interface de défilement volet ne vous fiez pas seulement sur la taille de son contenu
Je peux voir votre problème.
Ici, vous définissez la limite et la taille de votre groupe.
vous pouvez alors définir la limite du composant scrollPane
Bien, les bornes du panneau est inutile, cause scrollPane ne se préoccupe que de la taille, et la taille du groupe est plus petit, alors les limites du composant scrollPane, de sorte que le scrollPanel pense qu'il n'a pas besoin de montrer quoi que ce soit d'autre, c'est pourquoi il ne veut pas afficher les barres de défilement ou les activer.
OBS: je ne vois pas de sens à mettre à la disposition de la scrollPanel. De sorte que vous pouvez sauter cette ligne.
Juste comme commentaire: à l'Aide de défilement avec absolut fenêtre présentation est très bien puisque vous faites les soins de la taille de la fenêtre.