2015-08-29 2 views
-1

Я пытаюсь создать графический интерфейс, и я хочу разместить элементы в определенных местах. Я сделал макет моей панели пустым, чтобы я мог это сделать. Однако ничто не появится, когда панель имеет значение null.
Вот код:JPanel не отображает компоненты, когда макет равен нулю

public class OverView extends JFrame { 

    //height and width of screen 
    Toolkit tk = Toolkit.getDefaultToolkit(); 
    int x = ((int) tk.getScreenSize().getWidth());//length of screen 
    int y = ((int) tk.getScreenSize().getHeight());//height 

    //components 
    private JLabel title; 
    private JLabel description; 
    private JPanel panel; 
    private ArrayList<JButton> farms; 

    //farm variables 
    public ArrayList<Farm> owned; 


    public OverView(ArrayList<Farm> owned) { 
     super("The Lolipop Farm - Overview"); 
     setSize(700, 700); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(null); 

     //initialize variables 
     this.owned = owned; 
     panel = new JPanel(); 
     panel.setLayout(null); 
     title = new JLabel("<html>Your Farms - The Lolipop Farm" 
       + "<br> <font size=1000> <i> An Eph Production </i> </font></html>"); 

     //set background color, color, and font of JComponents 
     title.setFont(new Font("serif", Font.BOLD, 25)); 
     title.setBackground(Color.GRAY); 
     title.setOpaque(true); 

     //set size and location of the components 
     title.setSize(350, 120); 
     title.setLocation(x/2, 600); 

     //add to panel 
     panel.add(title); 

     //add panel to the screen 
     add(panel);   

    } 

} 

Почему не панель, показывая что-нибудь, когда нуль компоновщика?

+2

* «Я хочу размещать элементы в определенных местах» * Java GUI должны работать с различными ОС, размером экрана, разрешением экрана и т. Д., Используя различные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

+0

Предоставьте ASCII-рисунок или простой чертеж * предназначенного макета GUI с минимальным размером и, если он изменен, с большей шириной и высотой. –

ответ

2

Как Обзор представляет собой кадр, я думаю, вы должны вызвать метод

setVisible(true); 

согласно https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html для того, чтобы сделать его видимым. Теперь, если это не работает, интересно, создался ли экземпляр класса Обзор где-то еще в вашем коде или в методе Main. Если вы этого не сделали, то нет объекта, который может отображать панель внутри вашего класса, чтобы ваша программа ничего не показывала.

+0

* «Теперь, если это не работает». * Это не так. * «Если вы этого не сделали, то нет объекта, который может отображать панель внутри вашего класса, чтобы ваша программа ничего не показывала». * Даже после того, как рамка установлена ​​видимой, нет панели по одной простой причине что я считаю, что лучше не раскрывать., –

+0

Я установил рамку видимой, и экземпляр OverView создан в другом классе. –

+0

* «Я установил рамку видимой.» * Это лучше всего показано в [mcve], но, поскольку вы проигнорировали мое предыдущее предложение опубликовать искусство ASCII, я думаю, вы тоже проигнорируете это. Голосование закрывается. В стороне, этот код выше не компилируется, даже с соответствующим импортом, также включает в себя 'main (String [])', необходимый для его запуска и отображения кадра на экране. –

0

Ваша проблема с кодом

setLayout(null); 

Это позволит установить расположение JFrame к нулю, так как вы расширяете (наследуя его). У вас must есть макет для JFrame, хотя вы можете обойтись без макета для JPanel. Просто удалите эту строку, и все будет хорошо.

EDIT: И, конечно, вам нужно позвонить setVisible (true), как сказал другой парень.

+0

Вы правильно определили проблему с кодом OP, и я собирался подняться до тех пор, пока не увидел * «У вас ** должен быть ** макет для JFrame, хотя вы можете обойтись без макета для JPanel». * Это неверно. Фрейм также может иметь макет «null», если OP затем явно задает размер панели, которую он содержит, - расширяя «логику» установки размеров и позиций компонентов на панели. Но весь этот маршрут ведет к безумию. ОП продолжит возвращаться с «знаменитыми последними словами» * «Еще одна проблема ...» *, пока люди не устанут видеть их и их код «нулевого» макета. –

 Смежные вопросы

  • Нет связанных вопросов^_^