2016-03-25 3 views
1

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

 mainFrame = new JFrame("Basket Game"); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     mainPanel.add(options); 
     mainPanel.add(pname); 
     mainPanel.add(info); 
     mainPanel.add(gamearea);  

    mainFrame.setContentPane(mainPanel); 
    mainFrame.pack(); 
    mainFrame.getContentPane().setBackground(Color.LIGHT_GRAY); 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(600,600); 

форма выглядит следующим образом:

form

Первая 3 панель нормально для меня. Но для последней панели (черный) я хочу добавить некоторые компоненты с пользовательскими координатами. Но когда я пытаюсь добавить их с пользовательскими координатами:

basket.setLocation(500, 500); 
gamearea.add(basket); 

Он идет прямо сверху по центру панели (координаты не влияет на это место)

second

Когда я поставил gameareI сек layout to null Я не вижу свою метку на панели. Я думаю, что я должен сделать что-то дополнительное для этого. Как я могу это сделать?

+0

Ваше главное окно - только 600x600. В строке заголовка «Параметры», «Имя игрока» и «Информация» y = 500, вероятно, находится под нижней частью панели. – AJNeufeld

+0

Вы понимаете, как работает менеджер компоновки? Вы понимаете, какую ответственность несет менеджер компоновки? Вы понимаете, кто сбрасывает API с менеджером компоновки? Если вы этого не сделаете, нулевой макет - это не тот выбор, который вы ищете. Почти во всех случаях, когда вы думаете, что хотите нулевой макет, вы, вероятно, этого не делаете. В тех редких случаях нулевой макет может быть полезен, пользовательский макет приведет к гораздо меньшему количеству проблем и переделке – MadProgrammer

ответ

1

Проблема не в вашем менеджере компоновки (null), ни в том, что что-то не учитывается. Проблема в том, что просто 500x500 находится за пределами game area.

public class NullLayout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(NullLayout::new); 
    } 

    NullLayout() { 
     JFrame frame = new JFrame("Basket Game"); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 4; i++) { 
      JPanel strip = new JPanel(); 
      strip.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50)); 
      strip.setBorder(BorderFactory.createTitledBorder("Strip " + i)); 
      strip.add(new JLabel("Strip " + i)); 
      mainPanel.add(strip); 
     } 

     JPanel gamearea = new JPanel(); 
     gamearea.setLayout(null); 
     mainPanel.add(gamearea); 

     for (int i = 0; i < 5; i++) { 
      int x = i * 100, y = i * 100; 
      JPanel basket = new JPanel(); 
      basket.setSize(200, 50); 
      basket.setLocation(x, y); 
      basket.setBackground(Color.YELLOW); 
      basket.add(new JLabel("x = " + x + ", y = " + y)); 
      gamearea.add(basket); 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setSize(600, 600); 

     frame.setVisible(true); 
    } 
} 

Basket showing (0,0), to (300,300), but not (400,400)

Обратите внимание, что Basket на 400,400 не показывает; это будет не в нижней части игровой зоны.

0

Почти всегда неправильно использовать нулевой макет. Вы должны использовать LayoutManager, который помогает размещать компоненты там, где они вам нужны, особенно полезно, если пользователь изменяет размер основного фрейма. Используйте макет GridBag или Mig.

Если вы абсолютно настаиваете на использовании нулевого макета, создайте новый класс GameArea, который расширяет JPanel, переопределяет его метод paintComponent() и устанавливает позиции детей с помощью child.setBounds (...). Убедитесь, что первый оператор в вашем переопределенном методе - super.paintComponent(g);.

+0

Макет «null» определенно разрешен. См. Https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html – AJNeufeld

+0

Кроме того, пользователь не может изменить размер окна, так как 'mainFrame.setResizable (false);' был вызван , – AJNeufeld

+0

@AJNeufeld это может быть «разрешено», но он сильно обескуражен, и в любое время, когда вы думаете, что вам это нужно, вы, вероятно, этого не делаете. Весь API Swing написан вокруг API-интерфейса компоновки и отбрасывает огромную ответственность перед разработчиком, который больше всего не готов к его устранению. – MadProgrammer

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