Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Простое обычное окошко


Автор: Cheese 19.3.2009, 20:52
Господа, я тут столкнулся с какой-то глупостью. Мне надо вывести через Swing окно, чтобы
- Были известны размеры рабочей области (то есть "внутренне содержимое", без рамок и украшений)
- Нельзя было менять размеры.
- Работало и под Linux и под Windows.
Суть понятна - надо кинуть на форму JPanel нужного размера, а потом применить pack() и окно само сожмётся, но не работает, каналья! Точнее, результаты из под разных ОС различаются, размеры окна не те.

Например, вот этот код выдаёт нужные результаты под виндой, а в линуксе окошко прямоугольное.
Код

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game
{
public static void main(String[]args)
{
    JFrame frame = new JFrame("Sample");
    JPanel panel = new JPanel();
    
    panel.setPreferredSize(new Dimension(200,200));    
    frame.getContentPane().add(panel);
    
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}


Что делать, люди?

Автор: frodo5 20.3.2009, 08:11
frame.setSize(200,200) религия не позволяет?

Автор: Connie 20.3.2009, 08:59
Код
frame.setSize(200,200) религия не позволяет? 
И pack() не использовать.

Автор: Turinets 20.3.2009, 10:39
Попробуй так:
Код
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AlfaFrame
{
public static void main(String[]args)
{
    JFrame frame = new JFrame("Sample");
    JPanel panel = new JPanel(){
        };

    panel.setPreferredSize(new Dimension(200,200));
    frame.getContentPane().add(panel);
    

   /// frame.pack();
    frame.setResizable(false);
    
    frame.pack();   //!!!!
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    System.out.println("Size "+panel.getSize().getWidth()+"  "+panel.getSize().getHeight());
    System.out.println("Size "+frame.getContentPane().getSize().getWidth()+"  "+frame.getContentPane().getSize().getHeight());
}
}


Т.е. если вызвать pack() после SetResizable(), вроде всё нормально получается.


А насчёт использовать setSize(), ну так изменять надо не размеры понели, а размеры фрейма. Помоему Вы не правильно поняли задачу. Нужна рабочая область фиксированного размера, и нужен фрейм, который будет подогнан под эту область. Именно pack() она и решается. Так что правильная вещь - религия.

Автор: Turinets 20.3.2009, 10:54
Хотя на всякий случай можно проверить дело так:
Код

if(panel.getSize().getWidth()!=200){
      panel.setPreferredSize(new Dimension(400-(int)(panel.getSize().getWidth()),400-(int)(panel.getSize().getHeight())));
    pack();
}


Т.е. сделать один pack, если размеры получились не те, то вычислить попровку и задать новые размеры с последующим pack().

Автор: Cheese 20.3.2009, 16:51
Не работает, однако. В линуксе окно вытягивается вширь.

Автор: Turinets 20.3.2009, 17:31
А можешь рассказать что в линухе происходит?
Какие размеры получается у панели\ фрейма?
Может просто у фрейма минимальные размеры есть скажем 300.100 поэтому и получается размеры 300,200. Скажи что происходит.
1) какие размеры при задании размера 200,200.
2) какие размеры при задании размера 300,300
.. вобщем как меняется ситуация при изменении размера.

Автор: Cheese 20.3.2009, 17:37
Я сам не понимаю толком, как там всё получается. В линуксе окно вытянуто по вертикали, пикселей на 30, панелька тоже почему-то вытянута.

Автор: Turinets 20.3.2009, 17:41
Размеры можешь сказать?

И даже спрасить стесняюсь: какое разрешение в линухе у тебя? может там масштаб (dx/dy) иной?

Автор: Connie 20.3.2009, 20:42
Вот только что под linux сделал
Код

public class Main extends JFrame {
/**
*
*/


    public Main() {
        JPanel pane = new JPanel();
        pane.setPreferredSize(new Dimension(150,150));
        pane.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        add(pane);
        pack();
       setResizable(false);//забыл
    }

    public static void main(String[] args) {
        Main mf = new Main();
        mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mf.setVisible(true);

    }

}

Автор: Turinets 21.3.2009, 08:14
А чем этот код отличается от предыдущего? Или это намер, что у автора Линукс какой-то не такой?(Точнее Java на нем).

У меня под виндой такая фигня была:
если ракать после setResizable(false), то размеры получается 200, 200.
А если до, то 202, 202 (т.е. на 2 пиксела больше).

Автор: Connie 21.3.2009, 10:39
Цитата(Turinets @ 21.3.2009,  08:14)
А чем этот код отличается от предыдущего? Или это намер, что у автора Линукс какой-то не такой?(Точнее Java на нем).

У меня под виндой такая фигня была:
если ракать после setResizable(false), то размеры получается 200, 200.
А если до, то 202, 202 (т.е. на 2 пиксела больше).

Ничем, и мой и пример выше дают одинаковые результаты и перестановка pack не меняет размер

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