2012-05-08 11 views
5

Eventuali duplicati:
JDialog allow user to only change width of the dialogJDialog altezza fissa

Ho un JDialog che vorrei la larghezza di essere ridimensionabile, ma l'altezza non è.

Questo è il mio codice corrente:

addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent e) { 
     setLocation(getLocation().x, getLocation().y + (getHeight() - staticHeight)); 
     setSize(new Dimension(getWidth(), staticHeight)); 
     super.componentResized(e); 
    } 
}); 

Il problema è che il codice viene chiamato dopo che la finestra viene ridimensionata. Rendendo la finestra ridimensionata e poi fuggi.

Mi piacerebbe farlo in modo che quando l'utente cerca di trascinare l'altezza della finestra non fa nulla.

+0

+1, mi hai fatto imparare qualcosa oggi :-) –

risposta

3

sembra non puoi. c'è un metodo setResizable() ma il suo tutto-o-niente.
Si potrebbe provare a mitigare questo utilizzando un layout all'interno del JDialog in modo che il contenuto rimanga della stessa altezza indipendentemente dall'altezza JDialog
o forse (un po 'più radicale) impostarlo come non ridimensionabile e implementare il proprio listener del mouse per ridimensionare te stesso ? in questo modo si potrebbe avere il pieno controllo

3

Dopo aver cercato per un po ', non ho potuto trovare soluzioni davvero soddisfacenti. Penso che il ridimensionamento del dialogo sia qualcosa che viene gestito direttamente a livello di sistema operativo e quindi puoi solo dire che lo vuoi totalmente non ridimensionabile o totalmente ridimensionabile.

Il codice seguente impedirà sempre che la finestra di dialogo sia più grande, ma mentre l'utente ridimensiona la finestra di dialogo, i bordi della finestra di dialogo si spostano ancora.

L'altra opzione, suggerita anche da radai, sarebbe impedire il ridimensionamento e impostare un riquadro del contenuto personalizzato con un listener del mouse che ascolti il ​​mouse e ridimensiona di conseguenza. Tuttavia, penso che questo non si sentirà molto nativo per l'utente (non penso che sarete in grado di catturare gli eventi sul bordo della finestra di dialogo).

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); 

    } 
} 
+0

non non c'è alcuna soluzione adeguata, ComponetListener non è modo corretto, ho visto trucco sporco che il mouse non-armata dal contenitore dopo, vedere la mia risposta qui – mKorbel

+0

aaaaaaaaaccch +1 – mKorbel

4
  • non si può direttamente per fermare il ridimensionamento,

  • non è possibile bloccare proprietà fondamentale di contenitori,

  • contenitore becase da OS nativo e sono costruite sulle sue proprietà ,

  • e limitazioni per il ridimensionamento è formato di schermo

  • resto sono (con prefisso) Resizing Components by @camickr

  • ci sono mod sporco sulla base di AbsoluteLayout, e io non suggeriscono l'uso che

  • blocco ridimensionare se c'è qualche sfarfallio o congelare durante ridimensionare

+0

+1 per la conferma e la risposta molto strutturata –

+0

Ho appena scoperto che questo può essere fatto, dal codice dato da me :-) Scusa non da me ma da "Darryl Burke": -) –

1

Qui prova questo esempio di codice, è così che si imposta JDialog per non avere ridimensionamento verticale.Anche se davvero non voglio prendermi il merito, tutto il merito va al creatore di questo programma che è "Darryl Burke" il link al programma è here.

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); 
    } 
} 
+0

Darryl è grande mente +1, di nuovo non sono d'accordo con gli hack sporchi, né con java.awt.Robot, perché è API per scopi di test, non designato per codice di produzione, scusate il mio punto di vista, forse qualcuno potrebbe essere satifyied con quello – mKorbel

+0

Nah , piuttosto la tua risposta è buona come una y altra risposta, troppo vera, certe cose sono destinate ad essere controllate dal sistema operativo, e dovrebbero essere trattate come tali, senza alcuna interferenza :-) –

Problemi correlati