4 Réponses :


3
votes

On dirait que tu ne peux pas. Il y a une méthode assaisisable () mais sa tout ou rien. de
Vous pouvez essayer d'atténuer cela en utilisant une mise en page dans votre JDialog afin que votre contenu reste la même hauteur quelle que soit la hauteur JDialog.
Ou peut-être (un peu plus radical) le définit comme non redimensionnable et implémentez votre propre auditeur de souris pour vous redimensionner? de cette façon, vous pourriez avoir le contrôle total


0 commentaires

3
votes

Après avoir cherché un moment, je n'ai pas trouvé de solutions vraiment satisfaisantes. Je pense que le redimensionnement de la boîte de dialogue est quelque chose qui est traité directement au niveau du système d'exploitation et que vous ne pouvez donc dire que vous voulez que cela ne soit pas totalement redimensionnable ou totalement redimensionnable.

Le code ci-dessous empêchera toujours la boîte de dialogue d'être plus grande, Mais comme l'utilisateur redimensionne la boîte de dialogue, les bordures de la boîte de dialogue se déplacent toujours. p>

L'autre option, également suggérée par RADAI, serait d'empêcher de redimensionner et de définir une vitre de contenu personnalisé avec un auditeur de souris qui écoute la souris et redimensionner en conséquence. Cependant, je pense que cela ne se sentira pas très originaire de l'utilisateur (je ne pense pas que vous puissiez attraper les événements sur la frontière de la boîte de dialogue). P>

import java.awt.Frame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                init();
            }
        });
    }

    public static void init() {
        final int staticHeight = 150;
        final JDialog dialog = new JDialog((Frame) null) {

            @Override
            protected JRootPane createRootPane() {
                JRootPane rp = new JRootPane() {
                    @Override
                    public void reshape(int x, int y, int w, int h) {
                        super.reshape(x, y, w, staticHeight);
                    }
                };
                rp.setOpaque(true);
                return rp;
            }

            @Override
            public void reshape(int x, int y, int width, int height) {
                super.reshape(x, y, width, staticHeight);
            }

        };
        dialog.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                dialog.setSize(dialog.getWidth(), staticHeight);
            }
        });
        dialog.pack();
        dialog.setVisible(true);

    }
}


1 commentaires

Non, il n'y a pas de solution appropriée, le composantlistener n'est pas correct, j'ai vu Sale Hack que la souris non armée de conteneur après, s'il vous plaît voir ma réponse ici



4
votes
  • Vous ne pouvez pas arrêter directement de résoudre,

  • Vous ne pouvez pas bloquer la propriété de base des conteneurs,

  • conteneur car à partir d'un système d'exploitation natif et repose sur ses propriétés,

  • et les limitations de redimensionnement sont la taille de l'écran

  • reposez-vous (avec code) Resizing Composants de @camickr

  • Il y a Sale Hack basé sur Absolutelayout, et je ne suggère pas d'utiliser ce

  • bloc redimensionner s'il y a un clignotant ou un gel pendant le redimensionnement


2 commentaires

+1 pour la confirmation et la réponse très structurée


Je viens de découvrir que cela peut être fait, par le code donné par moi :-) Désolé de moi, mais par "Darryl Burke" :-)



1
votes

Ici, essayez cet exemple de code, c'est ainsi que vous définissez le JDialog code> pour ne pas avoir de redimensionnement vertical. Bien que je ne souhaite vraiment pas prendre de crédit pour cela, tout le crédit va au créateur de ce programme qui est "Darryl Burke", le lien vers le programme est ici .

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  

public class WidthResizeableDialog {  

  Robot robot;  
  static final int HEIGHT = 400;  
  Point lastLocation;  

  public static void main(String[] args) {  
    SwingUtilities.invokeLater(new Runnable() {  

      @Override  
      public void run() {  
        new WidthResizeableDialog().makeUI();  
      }  
    });  
  }  

  public void makeUI() {  
    try {  
      robot = new Robot();  
    } catch (AWTException ex) {  
      ex.printStackTrace();  
    }  
    final JDialog dialog = new JDialog();  
    dialog.setSize(400, HEIGHT);  
    dialog.setLocationRelativeTo(null);  
    dialog.addWindowListener(new WindowAdapter() {  

      @Override  
      public void windowClosing(WindowEvent e) {  
        System.exit(0);  
      }  
    });  
    dialog.addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentMoved(ComponentEvent e) {  
        SwingUtilities.invokeLater(new Runnable() {  

          @Override  
          public void run() {  
            lastLocation = dialog.getLocation();  
          }  
        });  
      }  
    });  
    dialog.getRootPane().addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentResized(ComponentEvent e) {  
        int height = dialog.getHeight();  
        if (robot != null && height != HEIGHT) {  
          robot.mouseRelease(InputEvent.BUTTON1_MASK);  
          dialog.setLocation(lastLocation);  
          dialog.setSize(dialog.getWidth(), HEIGHT);  
        }  
      }  
    });  
    dialog.setVisible(true);  
  }  
} 


2 commentaires

Darryl est excellent esprit +1, encore une fois, je suis en désaccord avec des hacks sales, ni avec Java.Awt.Robot, car l'API à des fins de test, non désignée pour le code de production, désolé mon point de vue, peut-être que quelqu'un pourrait être satisfait de ce que


Nah, plutôt votre réponse est aussi bonne que toute autre réponse, trop vraie, certaines choses sont censées être contrôlées par le système d'exploitation et elles devraient être traitées comme telles, sans aucune interférence :-)