2015-10-30 2 views
-1

По существу, я пытаюсь добавить домашний экран с 4 кнопками, тремя кнопками сложности и кнопкой воспроизведения. Я добавляю кнопки в JPanel и добавляю JPanel с помощью BoxLayout центра. Почему кнопки все еще идут вправо? Установка значка для JLabel и добавление его на главный экран JPanel - это возможный беспорядок потока компонентов? Я хочу, чтобы кнопки сложности находились поверх gif с кнопкой Play внизу. Спасибо за вашу помощь.Менеджеры макета с иконкой (gif)

//container 
    snake = new JFrame(); 
    snake.setLayout(new BorderLayout()); 

    //home screen panel 
    homeScreen = new JPanel(); 
    homeScreen.setLayout(new BoxLayout(homeScreen, BoxLayout.X_AXIS)); 
    homeScreen.setPreferredSize(new Dimension(320, 320)); 

    JLabel bg = new JLabel(); 
    ImageIcon icon = new ImageIcon("HomeBG.gif"); 
    icon.getImage().flush(); 
    bg.setIcon(icon); 
    homeScreen.add(bg); 

    easy = new JButton("Easy"); 
    medium = new JButton("Medium"); 
    hard = new JButton("Hard"); 
    play = new JButton("Play"); 


    //button listeners code here 

    homeScreen.add(easy); 
    homeScreen.add(medium); 
    homeScreen.add(hard); 
    homeScreen.add(play); 

    snake.add(homeScreen, BorderLayout.CENTER); 
    snake.setTitle("Snake Game"); 
    snake.pack(); 
    snake.setVisible(true); 
    snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

GameLayout

+1

1) Для лучшей помощи рано, опубликовать [MCVE] или [Short, самодостаточными, Правильный пример] (http://www.sscce.org/). 2) Обеспечить ASCII-искусство или простой рисунок * предназначенного макета GUI при минимальном размере и, если он изменен, с большей шириной и высотой. –

ответ

2

Вы должны изменить свой код, как показано ниже.

snake = new JFrame(); 
snake.setLayout(new BorderLayout()); 

//home screen panel 
homeScreen = new JPanel(new BorderLayout()); 
//homeScreen.setLayout(new BoxLayout(homeScreen, BoxLayout.X_AXIS)); 
homeScreen.setPreferredSize(new Dimension(320, 320)); // probably you need to remove this line! 

JLabel bg = new JLabel(); 
ImageIcon icon = new ImageIcon("HomeBG.gif"); 
icon.getImage().flush(); 
bg.setIcon(icon); 
homeScreen.add(bg); 

easy = new JButton("Easy"); 
medium = new JButton("Medium"); 
hard = new JButton("Hard"); 
play = new JButton("Play"); 


//button listeners code here 
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
buttonsPanel.add(easy); 
buttonsPanel.add(medium); 
buttonsPanel.add(hard); 
buttonsPanel.add(play); 

homeScreen.add(buttonsPanel, BorderLayout.NORTH); 

snake.add(homeScreen, BorderLayout.CENTER); 
snake.setTitle("Snake Game"); 
snake.pack(); 
snake.setVisible(true); 
snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

Наконец-то! Это добавляет все кнопки в верхнюю часть игры. Я уверен, что смогу это взять. Спасибо огромное! –

+1

[Должен ли я избегать использования методов метода Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize- методы-в-java-swi) – MadProgrammer

+0

Я всегда делаю setPreferredSize. Я думаю, что это хорошая вещь. Или это будет другой размер. –

2

Я бы использовал составную схему для этого. Поместите кнопки уровня в (панель в a) FlowLayout. Поместите кнопку воспроизведения во 2-й FlowLayout. Добавьте эти панели в PAGE_START и PAGE_END из BorderLayout. Добавьте метку, содержащую GIF, к CENTER того же макета границы.

BTW - кнопки уровня должны быть переключателями (в группе кнопок - BNI).

enter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class LayoutManagersWithIcon { 

    private JComponent ui = null; 

    LayoutManagersWithIcon() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     JPanel levelPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5)); 
     ui.add(levelPanel, BorderLayout.PAGE_START); 
     levelPanel.add(new JRadioButton("Easy")); 
     levelPanel.add(new JRadioButton("Medium")); 
     levelPanel.add(new JRadioButton("Hard")); 

     JPanel startPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5)); 
     ui.add(startPanel, BorderLayout.PAGE_END); 
     startPanel.add(new JButton("Play")); 

     JLabel label = new JLabel(new ImageIcon(
       new BufferedImage(400, 100, BufferedImage.TYPE_INT_RGB))); 
     ui.add(label); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       LayoutManagersWithIcon o = new LayoutManagersWithIcon(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
Смежные вопросы