Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > resizable JFrame


Автор: serega34 15.3.2004, 19:40
Как сделать так чтобы можно было менять размер JFrame только по вертикали. (Есть ли какие нибудь библиотечные методы или это нужно реализовывть программно). Спасибо.

Автор: DarkDS 15.3.2004, 20:18
Нужно реализовывать программно...
Код

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize( 250, 100 );
final int h = frame.getHeight();
frame.addComponentListener( new ComponentListener()
{
   public void componentHidden(ComponentEvent e){}
   public void componentMoved(ComponentEvent e){}
   public void componentResized(ComponentEvent e)
   {
       Component component = e.getComponent();
       if ( component.getHeight() != h )
       component.setSize( component.getWidth(), h );
   }
   public void componentShown(ComponentEvent e){}
});
frame.show();

Автор: serega34 19.3.2004, 20:48
DarkDS большое спасибо за совет и пример.

Автор: Guest 23.3.2004, 18:14
Спасибо DarkDS !
и мне пригодилось smile.gif

Автор: ElectricalStorm 6.4.2004, 16:08
у меня такая проблемма сделал как тут показано ресайз
но при полном раскарытии наза не делается как сделать назад ?

Автор: DarkDS 6.4.2004, 17:26
То есть?

Автор: ElectricalStorm 6.4.2004, 17:47
тоесть когда нажимашь кнопку на фрейме "развернуть наполынй экран" то он развертывается максимально только по вертикали
потом нажимаем ее же тоесть свернуть назад - и ничего не происходит sad.gif

Автор: LSD 6.4.2004, 20:08
Можно не менять размер когда окно распахнули на весь экран
Код

  public void componentResized(ComponentEvent e)
  {
      Frame frame = (Frame) e.getComponent();
      if(frame.getExtendedState() != Frame.MAXIMIZED_BOTH &&  frame.getHeight() != h )
        frame.setSize( component.getWidth(), h );
  }

Автор: ElectricalStorm 6.4.2004, 21:51
LSD извините но неработает как вы сказали sad.gif

Автор: DarkDS 7.4.2004, 13:38
getExtendedState появилось с версии 1.4.2
Какая ява используется?

Автор: ElectricalStorm 7.4.2004, 14:02
java 1.4.2 просто при нажатии на кнопку - "развернуть на полный экран"
фрейм у меня теперь и по вертикали растягивается а мне это не надо ... sad.gif
Добавлено @ 14:04
получилось сделать вот так ...
Код


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

public class Test extends JFrame  {
   public Test() {
       JPanel p = new JPanel(new BorderLayout());

       p.add(new MyComp(this), BorderLayout.EAST);
       p.add(new JButton("Test"), BorderLayout.CENTER);
       getContentPane().add(p);
   }

   public static void main(String[] args) {
       Test frame = new Test();
       frame.setResizable(false);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setBounds(300, 300, 100, 200);
       frame.setVisible(true);
   }
}

class MyComp extends JComponent implements MouseMotionListener {
   private JFrame f;

   public MyComp(JFrame f) {
       this.f = f;
       setOpaque(false);
       setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
       setPreferredSize(new Dimension(3, 3));
       addMouseMotionListener(this);
   }

   public void mouseMoved(MouseEvent e) {
   }

   public void mouseDragged(MouseEvent e) {
       f.setSize(f.getWidth() + e.getX() - 3, f.getHeight());
       f.validate();
   }
}



теперь сижу думаю как мне это дело все прикрутить к моему ГУИ ....

Автор: ElectricalStorm 7.4.2004, 18:04
тока тут есть проблемма если приглядется или поставить JTextArea вместо JButton то становиться видно что
при ресайзе все мигает не клево sad.gif

как это исправить ?

Автор: DarkDS 7.4.2004, 19:32
Можешь объяснить что именно ты хочешь сделать? smile.gif

Автор: ElectricalStorm 8.4.2004, 12:11
я хочу ресайзить фрейм тока по горизонтали...
использую Ваш пример для этого ... все бы хорошо но вот беда когда я пытаюсь развернуть фрейм на полный экран он разворачиаеться довольно нормально ... но когда я его назад пытаюсь свернуть до того состояния в котором он был он не сворачивается просто напросто !
вот я хочу решить эту проблему ! но не знаю как sad.gif

Автор: LSD 8.4.2004, 20:27
Вот что у меня получилось
Код

frame.addComponentListener(new ComponentAdapter()
{
  public void componentResized(ComponentEvent e)
  {
     if ( e.getComponent().getHeight() != 300 &&
         ( ( JFrame ) e.getComponent() ).getExtendedState() != JFrame.MAXIMIZED_BOTH )
    {
       int w = e.getComponent().getWidth();
       e.getComponent().setSize( w, 300 );
    }
   }
});

Размер по высоте поменять можно но он вернется к первоначальному состоянию (в данном случае 300). Окно обычным образом разворачивается на весь экран, т.е. высота его не 300, но зато потом нормально возвращается обратно. Если убрать строку
( ( JFrame ) e.getComponent() ).getExtendedState() != JFrame.MAXIMIZED_BOTH
то окно вначале распахивается на весь экран, а потом у него устанавливается размер <ширина экрана>x300 и позиция (0,0) и соответственно вернуться в начальное состояние оно не может, а снова будет распахиваться и т.д. Если вы хотите реализовать что то наподобие главного окна Delphi или CBuilder то это по моему не возможно.

Автор: ElectricalStorm 9.4.2004, 09:23
к сожалению мне не вкоем случае нельзя менять размер по вертикали у меня все картинки посыпятся ...

Автор: LSD 9.4.2004, 19:56
Значит придется плюнуть на нормальное развертывание на весь экран, или вообще не развертывать или плевать на возвращение к исходному размеру.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)