2012-05-08 1 views
5

Можно создать дубликат:
JDialog allow user to only change width of the dialogJDialog фиксированная высота

У меня есть JDialog, что я хотел бы ширина быть изменяемыми, но высота не.

Это мой текущий код:

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

Проблема заключается в том, что код вызывается после того, как при изменении размера окна. Изменение размера окна, а затем мерцание.

Я хотел бы сделать это, когда пользователь пытается перетащить высоту окна, он ничего не делает.

+0

+1, ты меня не узнать что-то сегодня :-) –

ответ

3

похоже, что вы не можете. существует метод setResizable(), но его все или ничего.
вы можете попытаться смягчить это, используя макет внутри вашего JDialog, чтобы ваш контент оставался на той же высоте независимо от высоты JDialog
или, возможно, (немного более радикальной), устанавливал его как не изменяемый по размеру и реализовал собственный слушатель мыши для изменения размера сам ? таким образом, вы могли бы получить полный контроль

3

После того, как вы искали какое-то время, я не смог найти действительно удовлетворительных решений. Я думаю, что изменение размера диалогового окна - это то, что обрабатывается непосредственно на уровне ОС, и поэтому вы можете только сказать, что хотите, чтобы он полностью не изменялся или полностью изменялся.

Код ниже всегда будет препятствовать тому, чтобы диалог был больше, но по мере изменения размера диалогового окна границы диалогового окна все еще перемещаются.

Другой вариант, также предложенный radai, заключается в том, чтобы предотвратить изменение размера и установить пользовательскую область содержимого с помощью прослушивателя мыши, который прослушивает мышью и соответственно изменяет размер. Тем не менее, я думаю, что это не будет очень привычным для пользователя (я не думаю, что вы сможете поймать события на границе диалога).

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

нет нет никакого надлежащего решения, ComponetListener не правильный путь, я увидел грязный хак, который не-Вооруженный мышь из контейнера после того, как, пожалуйста, см мой ответ здесь – mKorbel

+0

aaaaaaaaaccch +1 – mKorbel

4
  • вы не можете непосредственно остановить изменение размера,

  • Вы не можете блокировать основные свойства контейнеров,

  • контейнер Becase от Native OS и построены на его свойства ,

  • и ограничения на изменение размера экрана -

  • остальные (с кодом) Resizing Components by @camickr

  • есть грязный хак на основе AbsoluteLayout, и я не предлагаю использовать что

  • блока изменение размеров, если есть какое-либо мерцание или замерзнуть во время изменения размеров

+0

+1 для подтверждения и очень структурированный ответ –

+0

Я только что узнал, что это можно сделать по коду, данному мной :-) Извините, но не мной, а «Darryl Burke»:) –

1

Здесь попробуйте этот пример кода, вот как вы установили JDialog, чтобы не было вертикального изменения размера.Хотя я действительно не хочу брать на это кредит, весь кредит принадлежит создателю этой программы, который является «Darryl Burke», ссылка на программу - 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 - отличный ум +1, снова я не согласен с грязными хаками или с java.awt.Robot, потому что API для целей тестирования, а не для кода производств, извините, мой взгляд, может быть, кто-то может быть удовлетворен этим – mKorbel

+0

Nah , скорее ваш ответ так же хорош, как y другой ответ, слишком верный, определенные вещи предназначены для управления ОС, и их следует рассматривать как таковые, без каких-либо помех :-) –