2015-03-16 3 views
0

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

После четырех часов работы я не смог решить свою проблему, поэтому я спрашиваю вас, ребята, знаете ли вы, что не так с моим кодом? Даже тяжело, я думаю, что я исключил очевидные проблемы (не добавляя панели к своей панели с макетом карты, не устанавливая макет и т. Д.). Я все еще думаю, что проблема должна быть чем-то очень простым. Но я ничего не нашел, помог.

Так к делу, вот моя "база GUI"

package teekkariloikka.gui; 

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


public class TLGui extends JFrame { 

    private static final long serialVersionUID = 1L; 

    private static final int WIDTH = 1000; 
    private static final int HEIGHT = 800; 

    private static final String MAINMENU = "mainmenu"; 
    private static final String GAME = "game"; 

    private JPanel basePanel; 

    private GameViewPanel gameViewPanel; 
    private MainMenuPanel mainMenuPanel; 

    JFrame frame = new JFrame(); 

    //Layout 
    private CardLayout cardL = new CardLayout(); 

    public TLGui(){ 

     //Frame stuff 
     frame.setTitle("Teekkariloikka"); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setResizable(false);  

     //This is the panel where I add the ohter panels for menu and game 
     basePanel = new JPanel(); 
     basePanel.setLayout(cardL); 

     //Creating the panels I want to add. Excuse the confusing naming. 
     gameViewPanel = new GameViewPanel(); 
     mainMenuPanel = new MainMenuPanel(); 

     //Adding the panels to the basePanel 
     basePanel.add(mainMenuPanel, MAINMENU); 
     basePanel.add(gameViewPanel, GAME); 
     cardL.show(basePanel, MAINMENU);   

     //ADDING basePanel to the frame 
     frame.add(basePanel); 

     //Action listeners for buttons. Take a look at the classes. 
     mainMenuPanel.setNewGameButtonListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       cardL.show(basePanel, GAME); 
      } 
     }); 

     gameViewPanel.setMainMenuButtonListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){{ 
       cardL.show(basePanel, MAINMENU); 
      } 
     }); 
    } 

    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run(){ 
       new TLGui(); 
      } 
     }); 
    } 
} 

Тогда мой MainMenuPanel класс. Это незавершенная работа, но по крайней мере должны показывать кнопки. Я изо всех сил старался перевести все, что я написал на финском языке (мой родной язык), и я очень надеюсь, что я не настолько слеп к своему коду, что что-то забыл.

package teekkariloikka.gui; 

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

public class MainMenuPanel extends JPanel{ 

    private static final long serialVersionUID = 1L; 

    //Buttons 
    private JPanel panel; 
    private JButton newGameButton; 
    private JButton quitButton; 

    //Font 
    Font menuFont = new Font("Arial", Font.BOLD, 24); 
    //Layout 
    private GridBagLayout menuLayout = new GridBagLayout(); 
    private GridBagConstraints c1 = new GridBagConstraints(); 

    public MainMenuPanel(){ 

     panel = new JPanel(); 

     //For testing //TODO remove 
     panel.setBackground(Color.BLACK); 

     newGameButton = new JButton("New Game"); 
     quitButton = new JButton("Quit"); 

     //New Game -button 
     newGameButton.setPreferredSize(new Dimension(200, 100)); 
     newGameButton.setFont(menuFont); 

     //Quit-button 
     quitButton.setPreferredSize(new Dimension(200, 100)); 
     quitButton.setFont(menuFont); 

     panel.setLayout(menuLayout); 
     c1.insets = new Insets(10, 10, 10, 10); 
     c1.gridx = 0; 
     c1.gridy = 1; 
     panel.add(newGameButton, c1); 
     c1.gridx = 0; 
     c1.gridy = 2; 
     panel.add(quitButton, c1); 
    } 

    //Idea: http://stackoverflow.com/questions/19104014/add-an-actionlistener-to-a-jbutton-from-another-class 
    public void setNewGameButtonListener(ActionListener listener){ 
     newGameButton.addActionListener(listener); 
    } 

    public void setQuitButtonListener(ActionListener listener){ 
     quitButton.addActionListener(listener); 
    } 
} 

И класс GameViewPanel. Также работа в процессе, но, как и предыдущий класс, это должно выглядеть просто отлично.

package teekkariloikka.gui; 

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

public class GameViewPanel extends JPanel{ 

    private static final long serialVersionUID = 1L; 

    private JButton lopetaButton; 
    private JButton tallennaButton; 
    private JButton menuButton; 

    BorderLayout bordL = new BorderLayout();  

    public GameViewPanel(){ 

     JPanel gameViewPanel = new JPanel(); 

     gameViewPanel.setLayout(bordL); 
     gameViewPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); 

     //Creating toolbar 
     JToolBar toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 

     gameViewPanel.setLayout(bordL); 
     gameViewPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); 
     gameViewPanel.add(toolbar, BorderLayout.PAGE_START);   

     //Buttons 
     lopetaButton = new JButton("Lopeta"); 
     menuButton = new JButton("Päävalikko"); 
     tallennaButton = new JButton("Tallenna"); 

     //Adding buttons to game view toolbar 
     toolbar.add(lopetaButton); //TODO Add functionality! 
     toolbar.add(tallennaButton); //TODO Add functionality! 
     toolbar.add(menuButton); //TODO Add functionality! 
    } 

    public void setMainMenuButtonListener(ActionListener listener){ 
     menuButton.addActionListener(listener); 
    } 
} 

Я надеюсь, что кто-то может указать на ошибку, которую я сделал - неважно, насколько глупо я себя чувствую.

Кроме того, любая другая обратная связь будет высоко оценена. Как я уже сказал, это мой первый раз, когда я пишу GUI, и я должен сказать, что время от времени я чувствую себя довольно потерянным.

+0

Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short , Self Contained, Правильный пример). –

ответ

0

В вашей MainMenuPanel панели вы создаете экземпляр JPanel ...

public MainMenuPanel(){ 
    // A new panel 
    panel = new JPanel(); 

    //For testing //TODO remove 
    panel.setBackground(Color.BLACK); 

    newGameButton = new JButton("New Game"); 
    quitButton = new JButton("Quit"); 

    //New Game -button 
    newGameButton.setPreferredSize(new Dimension(200, 100)); 
    newGameButton.setFont(menuFont); 

    //Quit-button 
    quitButton.setPreferredSize(new Dimension(200, 100)); 
    quitButton.setFont(menuFont); 

    panel.setLayout(menuLayout); 
    c1.insets = new Insets(10, 10, 10, 10); 
    c1.gridx = 0; 
    c1.gridy = 1; 
    panel.add(newGameButton, c1); 
    c1.gridx = 0; 
    c1.gridy = 2; 
    panel.add(quitButton, c1); 
    // But what do you do with panel?? 
} 

Но никогда не добавить его в свой MainMenuPanel ...

Вы также сделать то же самое в вашем GameMenu ...

public GameViewPanel(){ 

    // Create JPanel... 
    JPanel gameViewPanel = new JPanel(); 

    gameViewPanel.setLayout(bordL); 
    gameViewPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); 

    //Creating toolbar 
    JToolBar toolbar = new JToolBar(); 
    toolbar.setFloatable(false); 

    gameViewPanel.setLayout(bordL); 
    gameViewPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); 
    gameViewPanel.add(toolbar, BorderLayout.PAGE_START);   

    //Buttons 
    lopetaButton = new JButton("Lopeta"); 
    menuButton = new JButton("Päävalikko"); 
    tallennaButton = new JButton("Tallenna"); 

    //Adding buttons to game view toolbar 
    toolbar.add(lopetaButton); //TODO Add functionality! 
    toolbar.add(tallennaButton); //TODO Add functionality! 
    toolbar.add(menuButton); //TODO Add functionality! 
    // But never do anything with it... 
} 

Моя рекомендация, не надо. Оба MainMenuPanel и GameMenu простираются от JPanel, просто создайте пользовательский интерфейс на этих панелях напрямую. Кажется, что нет необходимости в этих «внутренних» панелях ...

+0

Эй! Спасибо за ваш ответ @MadProgrammer! Я не заметил этого, прежде чем публиковать его (я понял другое решение). Ах, я должен был понять, что создаю дополнительную панель. Как глупо ... Но что вы подразумеваете под «созданием вас непосредственно на этих панелях»? – Rikkokiri

+0

К сожалению, UI, мозг опережает мои пальцы ... – MadProgrammer

+0

Aah, ладно! Это прояснилось! Еще раз спасибо @MadProgrammer! – Rikkokiri

1
cardL.show(basePanel, "2"); 

Название панели не было «2».

Вы определяете переменные MAINMENU и GAME для представления имен каждой панели.

+0

Очень верно! Я изменил имена во время процесса и явно забыл изменить все. (Исправлено сейчас.) Спасибо! К сожалению, это не исправить мою проблему. – Rikkokiri

0

Хорошо, я сам сам понял, когда я перешел к другим вещам. Пока я изучал дизайн макета, я увидел фрагмент кода this и получил идею использовать эту «ссылку» в моих панельных классах.

Так что я удалил этот кусок кода из обоих MainMenuPanel и GameviewPanel

// A new panel 
panel = new JPanel(); 

, а затем заменить ссылки на этой панели с this. Пример из MainMenuPanel:

this.setLayout(menuLayout); 
c1.insets = new Insets(10, 10, 10, 10); 
c1.gridx = 0; 
c1.gridy = 1; 
this.add(newGameButton, c1); 
c1.gridx = 0; 
c1.gridy = 2; 
this.add(quitButton, c1); 

Я не могу сказать, что я прекрасно понимаю, почему это работает, и другой путь не делает, но на данный момент, рабочее решение все, что мне нужно. Надеюсь, это когда-нибудь будет полезно и для кого-то другого.

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