Redimensionner les composants sur l'image redimensionner Java

J'ai un peu de mal à essayer de redimensionner les composants dans mon interface graphique quand je redimensionner l'interface graphique. Maintenant, quand je redimensionner l'interface graphique, la taille des composants ne changent pas, ils gardent la statique de la taille de la je les. Quand j'ai redimensionner l'interface graphique passée de la taille minimale nécessaire à l'affichage d'eux, ils ne sont plus affichées. Je les veux pour redimensionner et de maintenir un ratio d'aspect lorsque l'interface utilisateur est redimensionnée.

Voici le code que j'ai pour le GUI:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class DraftGUI implements MouseListener {
private JPanel jpPack;
private JPanel jpCards;
private JPanel jpInfo;
private JPanel jpChat;
private TextField tf;
private StyledDocument doc;
private JTextPane tp;
private JScrollPane sp;
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
e.getComponent().setVisible(false);
}
private Client client;
public GUI(Client client) throws IOException {
JFrame frame = new JFrame("Draft");
//set the size to fullscreen to start
frame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
//set the content pane, we'll add everything to it and then add it to the frame
JPanel contentPane = new JPanel();
contentPane.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
contentPane.setLayout(new GridBagLayout());
//creates some panels with some default values for now
JPanel jpCards = new JPanel(new BorderLayout());
jpCards.setOpaque(true); //ensures it paints every pixel
jpCards.setBackground(Color.BLUE);
JPanel jpInfo = new JPanel();
jpInfo.setOpaque(true);
jpInfo.setBackground(Color.GREEN);
JPanel jpPack = new JPanel(new GridBagLayout());
jpPack.setOpaque(true);
jpPack.setBackground(Color.RED);
//grab some info to make the JTextPane and make it scroll
this.client = client;
tf = new TextField();
doc = new DefaultStyledDocument();
tp = new JTextPane(doc);
tp.setEditable(false);
tf.addActionListener(this.client);
sp = new JScrollPane(tp);
//adding the quantities to the chat panel
JPanel jpChat = new JPanel();
jpChat.setLayout(new BorderLayout());
jpChat.add("North", tf);
jpChat.add("Center", sp);
//a new GridBagConstraints used to set the properties/location of the panels
GridBagConstraints c = new GridBagConstraints(); 
//adding some panels to the content pane
//set it to start from the top left of the quadrant if it's too small
c.anchor = GridBagConstraints.FIRST_LINE_START; 
c.fill = GridBagConstraints.BOTH; //set it to fill both vertically and horizontally
c.gridx = 0; //set it to quadrant x=0 and
c.gridy = 0; //set it to quadrant y=0
c.weightx = 0.7;
c.weighty = 0.3;
contentPane.add(jpCards, c);
c.gridx = 1;
c.gridy = 0;
c.weightx = 0.3;
c.weighty = 0.3;
contentPane.add(jpInfo, c);
c.gridx = 0;
c.gridy = 1;
c.weightx = 0.7;
c.weighty = 0.7;
contentPane.add(jpPack, c);
c.gridx = 1;
c.gridy = 1;
c.weightx = 0.3;
c.weighty = 0.7;
contentPane.add(jpChat, c);
//set some necessary values 
frame.setContentPane(contentPane);
frame.setLocationByPlatform(true);
frame.setVisible(true);
//This code works for adding an Image
//need to learn how to specify a path not dependent on the specific users's machine
//this is not a high priority for now though
GridBagConstraints d = new GridBagConstraints();
d.gridx = 0;
d.gridy = 0;
ImageLabel imageLabel1 = new ImageLabel("path-to-file");
imageLabel1.setPreferredSize(new Dimension(223, 310));
jpPack.add(imageLabel1, d);
ImageLabel imageLabel2 = new ImageLabel("path-to-file");
imageLabel2.setPreferredSize(new Dimension(223, 310));
ImageLabel imageLabel3 = new ImageLabel("path-to-file");
imageLabel3.setPreferredSize(new Dimension(223, 310));
d.gridx = 1;
jpPack.add(imageLabel2, d);
d.gridy = 1;
jpPack.add(imageLabel3, d);
imageLabel1.addMouseListener(this);
imageLabel2.addMouseListener(this);
imageLabel3.addMouseListener(this);
//223, 310 are the aspect values for a card image, width, height
//these need to be maintained as the GUI size changes
}
}
class ImageLabel extends JLabel {
Image image;
ImageObserver imageObserver; 
//constructor with filename     
ImageLabel(String filename) {
ImageIcon icon = new ImageIcon(filename);
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
//constructor with icon
ImageLabel(ImageIcon icon) {
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
//overload setIcon method
void setIcon(ImageIcon icon) {
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
//overload paint()
public void paint( Graphics g ) {
super.paint( g );
g.drawImage(image,  0 , 0 , getWidth() , getHeight() , imageObserver);
}
}

Pour une raison quelconque, il n'y a pas de redimensionnement par défaut de la propriété pour le cadre et les composants, de sorte que lorsque l'image est redimensionnée, les composants ne rien faire. Je ne suis pas sûr de ce que je fais mal ou manqués, mais clairement j'ai oublié quelque chose.

Aussi, si quelqu'un sait, la ImageLabels prennent de l'espace supplémentaire autour d'eux. Le rembourrage est mis à 0 par défaut, donc je ne suis pas sûr de savoir pourquoi il se crée comme une bordure autour d'eux.

Grâce.

MODIFIER pour Guillaume:

Je sais que l'un des principaux est nécessaire si je veux l'exécuter comme une application autonome, il est actuellement partie d'une autre application et est appelé séparément de l'intérieur. Il n'était probablement pas la meilleure décision de le publier, sans exhaustivité, mais qu'importe, il ne peut pas être un grand problème.

Votre code pris sur la portion où la photo a été affichées. "path-to-file" était censé être remplacé par un fichier d'image, afin de vous afficher l'image. Il est difficile de voir réellement la question à portée de main quand c'est simplement du texte.

Lorsque vous avez l'image s'affiche correctement, et vous essayez de redimensionner l'ensemble de l'interface graphique, vous remarquerez que l'image n'est pas réduit. Il garde à sa taille par défaut et a des problèmes quand il devient plus petit que lui. Dans mon code, il s'arrête et affiche l'image complètement quand il ne peut pas s'afficher au moins la taille préférée. Dans votre code, il coupe une partie de l'image quand il se rétrécit.

Ce que je veux, c'est vraiment redimensionner le JLabel contenant l'image, ainsi que l'interface utilisateur graphique redimensionne, il en va de l'image. Il faut que l'image se rétrécit en conséquence pour mon programme. L'utilisateur devra par la suite les fonctionnalités en cliquant sur les images, afin de n'afficher que des images ou des parties d'entre eux n'est tout simplement pas le faire.

S'il vous plaît essayez de votre code/mon code et de reproduire le problème que je vais avoir, des tests avec des images, afin que nous puissions trouver une solution correcte. Merci.

Vous auriez besoin d'utiliser un autre gestionnaire de mise en page, puis d'autres de la grille de sac, l'aménagement, c'est honorer la taille préférée où il le peut. Sur le dessus de ma tête, je ne peux pas vous en recommander un. La question est de savoir comment déterminer le "ratio d'aspect"
Jetez un oeil à ma mise à jour de réponse.
une différence entre le votre et @GuillaumePolet s, c'est que vous activement court-circuit de l'auto-dimensionnement de l'étiquette: la règle générale est de ne jamais-jamais appeler l'une quelconque des setXXSize méthodes. Qui a dit: une image a-a taille fixe, si vous souhaitez mettre à l'échelle, vous avez à mettre en œuvre que l'intensification de vous-même
regardant à nouveau, quelques problèmes: a) imageLabel.setIcon(ImageIcon) est pas prépondérant de l'étiquette.setIcon(Icône) b) dans les swing, remplacer paintComponent pas peinture
Avez-vous résolu ce problème? Hésitez pas à répondre à votre propre question

OriginalL'auteur Michael Yousef | 2012-10-23