JLabel не появляется, кроме случаев, когда используется с mouselistener - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю над Java-игрой, и когда я добавляю JPanel с кнопками JLabel в JFrame, кнопки не отображаются, пока я не наведу на них курсор. Я попытался удалить mouselistener, но он просто делает кнопки невидимыми, даже если я наведу на них курсор. Я также пытался: validate (), revalidate (), изменение порядка добавления компонентов в Jframe.

Game.java:

    import javax.swing.*;
    public class Game {
    public static void main(String[] args) {
        JFrame ramka = new JFrame();
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setTitle("Super Boxxy");
        ramka.setResizable(false);
        ramka.pack();
        ramka.setLocationRelativeTo(null);
        Menu window = new Menu(ramka);
        window.ZbudujMenu(ramka);
     }
    }

Menu.java:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import static java.lang.Thread.sleep;

public class Menu extends JLabel implements MouseListener {
public Menu(JFrame ramka){
   this.ramka=ramka;
}
//Title Screen
JFrame ramka;
JLabel startButton;
JLabel exitButton;
ImageIcon titleIcon;
JLabel backgroundImg;
JPanel menu;

public static final int WIDTH = 1024;
public static final int HEIGHT = 640;

ImageIcon exitIcon =new ImageIcon("resources/exit.png");
ImageIcon exitIconHover =new ImageIcon("resources/exit_hover.png");

ImageIcon startIcon =new ImageIcon("resources/start.png");
ImageIcon startIconHover =new ImageIcon("resources/start_hover.png");

public void ZbudujMenu(JFrame ramka) {
    //Start button
    startButton = new JLabel();
    startButton.setIcon(startIcon);
    startButton.addMouseListener(this);


    //Exit button
    exitButton=new JLabel();
    exitButton.setIcon(exitIcon);
    exitButton.addMouseListener(this);


    //Background
    titleIcon =new ImageIcon("resources/background.png");
    backgroundImg = new JLabel(titleIcon);
    backgroundImg.setBounds(0,0,WIDTH,HEIGHT);
    backgroundImg.setLayout(new FlowLayout());


    //Frame
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ramka.setSize (WIDTH,HEIGHT);
    ramka.setTitle("Super Boxxy");

    menu = new JPanel(new GridLayout(2, 1, 8, 8));
    menu.add(startButton);
    menu.add(exitButton);
    menu.setBorder(BorderFactory.createEmptyBorder(353,370,54,370));

    ramka.add(backgroundImg);
    ramka.add(menu);
    ramka.setVisible(true);
    ramka.setLocationRelativeTo(null);


}
public void mouseClicked(MouseEvent akcja)
{
}
public void mouseEntered(MouseEvent akcja)
{
    if (akcja.getSource() == startButton)
    {
       startButton.setIcon(startIconHover);
    }
    else if (akcja.getSource() == exitButton)
    {
        exitButton.setIcon(exitIconHover);
    }
}
    public void mouseExited(MouseEvent akcja)
    {
       if (akcja.getSource() == startButton)
        {
            startButton.setIcon(startIcon);
        }
        else if (akcja.getSource() == exitButton)
        {
            exitButton.setIcon(exitIcon);
        }
    }
    public void mousePressed(MouseEvent akcja) {}
    public void mouseReleased(MouseEvent akcja) {}
}

1 Ответ

0 голосов
/ 07 сентября 2018

Компонент должен быть добавлен в кадр до того, как он станет видимым.

JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setTitle("Super Boxxy");
ramka.setResizable(false);
ramka.pack();

Вы создаете рамку и упаковываете ее без добавления каких-либо компонентов в рамку. Вы вызываете метод pack () ПОСЛЕ добавления компонентов к фрейму, чтобы все компоненты могли отображаться в их предпочтительном размере.

public class Menu extends JLabel implements MouseListener {  

Почему вы расширяете JLabel? Вы не добавляете какие-либо новые функции для метки.

Я бы посоветовал вашему классу:

  1. Расширьте JPanel, чтобы вы могли добавить все свои компоненты на панель
  2. весь код в методе ZbudujMenu(...) будет перемещен в конструктор класса Menu ().
  3. избавиться от всей логики JFrame из класса Menu.

Тогда код в методе main () будет выглядеть примерно так:

    JFrame ramka = new JFrame();
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ramka.setTitle("Super Boxxy");
    ramka.add( new Menu() ):
    ramka.setResizable(false);
    ramka.pack();
    ramka.setLocationRelativeTo(null);
    ramka.setVisible( true );
    //Menu window = new Menu(ramka);
    //window.ZbudujMenu(ramka);

Прочитайте учебник Swing . Существует множество демонстрационных программ, которые покажут вам, как создать графический интерфейс, используя эту базовую структуру. Демонстрации также покажут вам, как создать свой графический интерфейс на Event Dispatch Thread (EDT). Все компоненты Swing должны быть созданы на EDT.

...