Faire défiler l'image dans JFrame contentpane
J'essaie d'afficher une grande image à l'intérieur d'une JFrame du contentpane. Je voudrais faire l'image ou le contentpane de défilement que l'image est grande. J'ai essayé de le faire en utilisant Jscrollpane et l'ajouter dans le contentpane mais il ne fonctionne pas. Fait quelques recherches pour une solution, mais pas réussi à en trouver un. Quelqu'un peut-il me guider? Mon code ci-dessous
FinalEnvironment.java
package environment;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class FinalEnvironment{
public FinalEnvironment(){
Image Eastlake;
URL EastlakeURL = null;
EastlakeURL = FinalEnvironment.class.getResource("/image1/eastlake_night.png");
Eastlake = Toolkit.getDefaultToolkit().getImage(EastlakeURL);
JFrame frame = new JFrame("UniCat World");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
JMenuBar yellowMenuBar = new JMenuBar();
Map map = new Map(800, 550, Eastlake);
yellowMenuBar.setOpaque(true);
yellowMenuBar.setBackground(Color.YELLOW);
yellowMenuBar.setPreferredSize(new Dimension(800, 50));
frame.setJMenuBar(yellowMenuBar);
JScrollPane scroller = new JScrollPane(map);
scroller.setAutoscrolls(true);
scroller.setPreferredSize(new Dimension(800, 550));
frame.getContentPane().add(scroller, BorderLayout.CENTER);
frame.setSize(800, 600);
frame.setVisible(true);
}
public static void main(String[] args){
FinalEnvironment fe = new FinalEnvironment();
}
}
Voici mon map.java
package environment;
import java.awt.*;
import javax.swing.*;
public class Map extends JPanel{
private int width;
private int height;
private Image img;
public Map(int width, int height, Image img){
this.width = width;
this.height = height;
this.img = img;
}
protected void paintComponent(Graphics g)
{
super.paintComponents(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(img,0,0,2624,1696,null);
}
}
Enfin, je tiens à Jbuttons sur le dessus de cette image. Dois-je appeler un Rectangle et le placer sur le dessus de l'image dans le contentpane qui puis-je utiliser le Point à la position de mes boutons ou dois-je tout de suite utiliser l'image ou le composant lui-même de le faire? J'ai besoin de le bouton pour être en mesure de se synchroniser avec l'image quand elle défile au lieu de statique dans le contentpane.
Grâce
source d'informationauteur Noble
Vous devez vous connecter pour publier un commentaire.
Ce que je ferais ici:
1.Avoir un panneau (de la toile) qui seule responsabilité est de peindre une image donnée indépendante de la vraie taille de l'image dans la méthode substituée
paintComponent()
2.Assurez-vous que la toile taille préférée est égal à l'image taille réelle.
3.Avoir un deuxième panneau qui servira volet de contenu d'une image.
4.Il vous permettra de définir un
JScrollPane
comme son centre.5.Dans le défilement du volet de fenêtre d'affichage sera le composant à partir de l'étape 1.
6.Ajouter votre bouton sur la toile panneau à partir de l'étape 1. Il sera défile avec l'image.
7.Ajouter le volet de contenu, le groupe d'experts à partir de l'étape 3, pour un cadre, et exécuter l'application.
EDIT:
Exemple de Code avec le bouton ajouté à la toile, qui reste toujours à sa place, indépendant de la position de défilement ou la taille d'image.
Que si vous utilisez vos dimensions pour définir la Carte préférée de taille. Par exemple, donner la Carte de cette méthode:
De cette façon, la Carte Composite prendra la marge de manœuvre nécessaire pour afficher la totalité de l'image. Aussi, pourquoi est-ce que votre méthode drawImage dans la méthode paintComponent ont la grande magie numéros? Pourquoi ne pas utiliser la largeur et la hauteur-il ainsi? Edit 1: ou ne sont même pas spécifier la taille de l'image que Boro l'indique dans sa réponse (1+).
Pourquoi tout le monde est à réinventer la roue??? Il n'est pas nécessaire pour un panneau personnalisé pour peindre l'image!!!
Tout ce que vous devez faire est de créer un JLabel et ajouter une ImageIcon à l'étiquette et vous n'aurez pas un problème. Le label:
de la peinture de l'image en (0, 0) à sa taille d'origine (ce qui est exactement ce que le code personnalisé est en train de faire).
déterminer la taille de l'image en fonction de la taille de l'image. Maintenant, le défilement se fera automatiquement.
Aussi il est rarement raison d'utiliser le setPreferredSize() la méthode puisque tous les composants ont un défaut de taille préférée. Donc, vous ne devez pas définir la taille par défaut de la barre de menu. La seule fois où j'ai mis une taille préférée serait sur le JScrollPane. Cela permettra à l'image pour être emballé dans une taille raisonnable, et puis les barres de défilement apparaîtra automatiquement sur la base de la taille de l'image dans l'étiquette.
En plus d'autres réponses utiles, vous pourriez, comme l'étude de ce exemple qui utilise les mouvements de la souris pour faire défiler contenu arbitraire.