2015-08-15 6 views
0

Я работаю над небольшим меню для игры. Я уже сам делал игру, но у меня проблемы с моим меню. Когда я нажимаю кнопки «Правила и элементы управления», «Параметры» и «О», прикрепленные к ним JLabels не отображаются.Swing, JLabel не отображается

Что я делаю неправильно ...? Спасибо заранее.

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.Border; 



public class Menu extends JFrame 
{ 


    private static final long serialVersionUID = 1L; 

    public Menu() 
    { 


     // Creating a new JFrame and setting stuff 

      JFrame frame = new JFrame("BREAK THE BRICKS - MENU"); 
      frame.setResizable(false); 
      frame.setBounds(43, 10, 1280, 720); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 

     //Creating a menu panel 

      JPanel menupanel = new JPanel(); 
      menupanel.setLayout(null); 
      setContentPane(menupanel); 
      frame.add(menupanel); 



//PRINCIPAL BUTTONS OF THE MENU 

     //Creating buttons 

      JButton buttonrules = new JButton(); 
      JButton buttonoptions = new JButton(); 
      JButton buttonabout = new JButton(); 
      JButton buttonplay = new JButton("PLAY"); 

     //Setting their bounds 

      buttonrules.setBounds(56, 224, 400, 83); 
      buttonoptions.setBounds(56, 302, 400, 82); 
      buttonabout.setBounds(56, 379, 400, 83); 
      buttonplay.setBounds(56, 486, 400, 110); 

     //Setting their border's color 

      buttonrules.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 5)); 
      buttonoptions.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 5)); 
      buttonabout.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 5)); 
      buttonplay.setBorder(BorderFactory.createLineBorder(Color.GRAY, 5)); 

     //Setting their content and font 

      buttonrules.setContentAreaFilled(false); 
      buttonoptions.setContentAreaFilled(false); 
      buttonabout.setContentAreaFilled(false); 
      buttonplay.setFont(new Font("Mesquite Std", Font.PLAIN, 99)); 

     //Adding them to the principal panel 

      menupanel.add(buttonrules); 
      menupanel.add(buttonoptions); 
      menupanel.add(buttonabout); 
      menupanel.add(buttonplay); 



//BACKGROUND MENU'S IMAGE 

     //Attaching the principal background image to the principal panel 

      JLabel labelbackground = new JLabel(); 
      menupanel.add(labelbackground); 
      labelbackground.setBounds(0, 0, 1280, 720);     
      Image background = new ImageIcon(this.getClass().getResource("/Menu_Principal.jpg")).getImage(); 
      labelbackground.setIcon(new ImageIcon(background)); 


//BOXES ON THE RIGHT-HAND SIDE OF THE SCREEN 


     //RULES AND CONTROLS 

       //Creating a JLabel and setting stuff 

        JLabel labelboxrules = new JLabel(); 
        labelboxrules.setForeground(Color.WHITE); 
        labelboxrules.setBounds(475, 159, 754, 500); 

       //Importing rules and controls' image and setting it to its label 

        Image rulandconimg = new ImageIcon(this.getClass().getResource("/Rules_And_Controls.jpg")).getImage(); 
        labelboxrules.setIcon(new ImageIcon(rulandconimg)); 


     //OPTIONS 

       //Creating a JLabel and setting stuff 

        JLabel labelboxoptions = new JLabel(); 
        labelboxoptions.setForeground(Color.WHITE); 
        labelboxoptions.setBounds(475, 159, 754, 500); 

       //Importing options' image and setting it to its label 

        Image optionsimg = new ImageIcon(this.getClass().getResource("/Options.jpg")).getImage(); 
        labelboxoptions.setIcon(new ImageIcon(optionsimg)); 




     //ABOUT 

       //Creating a JLabel and setting stuff 

        JLabel labelboxabout = new JLabel(); 
        labelboxabout.setForeground(Color.WHITE); 
        labelboxabout.setBounds(475, 159, 754, 500); 

       //Importing about's image and setting it to its label 

        Image aboutimg = new ImageIcon(this.getClass().getResource("/About.jpg")).getImage(); 
        labelboxabout.setIcon(new ImageIcon(aboutimg)); 


    //THEIR FUTURE BORDER 

     Border boxborder = BorderFactory.createLineBorder(Color.LIGHT_GRAY, 5);  


//ASSOCIATING ACTIONS WITH MENU'S BUTTONS 

     //Rules and Controls 

      buttonrules.addActionListener(new ActionListener() 
        { 

        public void actionPerformed (ActionEvent a) 
         { 
          labelboxrules.setBorder(boxborder); 
          labelbackground.add(labelboxrules); 
          labelboxrules.setVisible(true); 
         } 

        }); 


     //Options 

      buttonoptions.addActionListener(new ActionListener() 
        { 

        public void actionPerformed (ActionEvent a) 
         { 
          labelboxoptions.setBorder(boxborder); 
          labelbackground.add(labelboxoptions); 
          labelboxoptions.setVisible(true);  
         } 

        }); 


     //About 

      buttonabout.addActionListener(new ActionListener() 
        { 

        public void actionPerformed (ActionEvent a) 
         { 
          labelboxabout.setBorder(boxborder); 
          labelbackground.add(labelboxabout); 
          labelboxabout.setVisible(true); 

         } 

        }); 




     //Play 

      buttonplay.addActionListener(new ActionListener() 
       { 

        public void actionPerformed (ActionEvent c) 
         { 

          Game.myGame(); 

         } 

       }); 

    } 
} 
+3

Не используйте пустые макеты. Swing был разработан для использования с менеджерами компоновки. – camickr

+0

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

+0

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

ответ

1

вы должны revalidate и repaint панели после добавления компонентов но в то время как кайкер и madprogrammer указали revalidate бессмысленно, когда не используют менеджеры макетов. Если вы используете менеджеров компоновки то вам нужно позвонить revalidate перед перекрашиванием. также по умолчанию jlables видны в отличие от jframes, поэтому вызов labelboxoptions.setVisible(true); является избыточным.

, например

buttonoptions.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent a) { 
       labelboxoptions.setBorder(boxborder); 
       labelbackground.add(labelboxoptions); 
       labelboxoptions.setVisible(true); 
       menupanel.repaint(); 

      } 

}); 

Примечание: не использовать нулевой макет. используйте менеджеров компоновки..

+0

Заказ revalidate() (для вызова диспетчера компоновки), а затем repaint() (чтобы убедиться, что компоненты окрашены). Конечно, revalidate() требуется только при использовании диспетчера компоновки. – camickr

+0

@camickr спасибо, что была ошибкой –

+0

Да, как указано в camickr, revalidate бессмысленно, когда не используется менеджер макетов – MadProgrammer

-2

Как полагает Эндрю и MadProgrammer

Dont использовать setLayout(null),

Обновлены и удалила не требуются заявления

+0

панель добавлена ​​с помощью 'setContentPane (menupanel);' .на панель панели видна –

+0

да, панель видна, но не компоненты на ней, т.е. кнопки, потому что макет равен – Garry

+0

'Когда я нажимаю кнопки кнопок, видны, потому что setbounds. При добавлении компонента в нулевую раскладку с указанием границ они будут видны –