简体   繁体   English

Java-如何使图像消失

[英]Java - How to make the images disappear

Hi I want to make my JPanel disappear so I wrote these lines of code 嗨,我想让我的JPanel消失,所以我写了以下几行代码

removeAll();
updateUI();
revalidate();

That only made the JComponents and JButtons disappear. 那只会使JComponents和JButtons消失。 I would like to make the images that I have displayed with the paint method disappear also. 我也想使用paint方法显示的图像也消失。 If I do setVisible(false), then I cannot add another JPanel behind it. 如果执行setVisible(false),则无法在其后添加另一个JPanel。

This is my class: 这是我的课:

package screens;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
public class menuScreen extends JPanel implements MouseListener{
    private static final long serialVersionUID = 1L;

//-------------VARIABLES---------------//
    Image wallpaper = (Image)Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/wallpaper.jpg"));
    Image title_text = (Image)Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/title-text.png"));
    ImageIcon startGameimg = new ImageIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/startGame.png")));
    ImageIcon optionsimg = new ImageIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/options.png")));
    //JButton start = new JButton(basketball);
    JLabel options = new JLabel(optionsimg);
    JLabel startGame =  new JLabel(startGameimg);
    gameScreen gS = new gameScreen();
    CardLayout scenechange = new CardLayout();
    JPanel scenechange1 = new JPanel (scenechange);

//-------------PAINT FUNCTION----------//
    public void paintComponent(Graphics g){
    g.drawImage(wallpaper,0,0,this);
    g.drawImage(title_text,0,0,this);
    //g.drawImage(basketball1,110,180,this);

    }

//-------------CONSTRUCTOR-------------//
    public menuScreen(){

    scenechange.addLayoutComponent(this,"menuScreen");
    scenechange.addLayoutComponent(gS,"gameScreen");
    //scenechange.show(this,"menuScreen");

    this.setLayout(null);
    this.add(options);
    this.add(startGame);
    startGame.setBounds(110,180,110,110);
    options.setBounds(110,300,110,110);
    startGame.addMouseListener(this);
    options.addMouseListener(this);


    }


    public void mouseClicked(MouseEvent e) {
    if(e.getSource() ==  (startGame)){

        removeAll();

        revalidate();
        add(gS);
    }

    if(e.getSource() == (options)){
        setVisible(false);
    }


    }


    public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

    }


    public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

    }


    public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

    }


    public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

    }


}//END OF CLASS startingScreen

Thanks in advance. 提前致谢。

First, don't call updateUI , it's related to the Look and Feel and not (directly) to updating your components. 首先,不要调用updateUI ,它与外观有关,而不是(直接)更新组件。

If you have provided a custom paint routine within in your panel, then you need away to stop it from painting the images (without preventing it from painting it's own content). 如果您在面板中提供了自定义的绘制例程,则需要阻止它绘制图像(而不能阻止它绘制其自身的内容)。 removeXxx will remove child components that you have previously added to the container. removeXxx将删除您先前添加到容器中的子组件。

A little more code would be useful 多一点的代码将很有用

UPDATE 更新

Fisrt, the images your painting aren't components of you container, they are been "stamped", you need some way to tell the component not to the paint the images 首先,您绘制的图像不是容器的组成部分,它们已被“标记”,您需要某种方式告诉组件不要对图像进行绘制

public void paintComponent(Graphics g){
    super.paintComponent(g); // this is super important
    if (paintImages){ // you need to define and set this flag
        g.drawImage(wallpaper,0,0,this);
        g.drawImage(title_text,0,0,this);
    }
}

Now, this will stop the images from been painted. 现在,这将停止绘制图像。

If, however, you no longer want to use the component (ie, you want to remove it from the screen so you can place a new component on the screen in its place), you need to remove this component from it's parent, which Code-Guru has suggested (so I won't steal his answer ;)) 但是,如果您不再希望使用该组件(即,您希望将其从屏幕上删除,以便可以在屏幕上的位置放置一个新组件),则需要从其父级中删除该组件。 -大师建议(所以我不会偷他的答案;))

UPDATE 更新

Okay, you had a kernel of an idea but either didn't quite know how to implement it or decided to discard it. 好的,您有一个想法的核心,但是要么不知道如何实现它,要么决定放弃它。

Basically, from the looks of your code, you were either trying to, or had, implement a CardLayout , unfortunately, you kind of got the wrong idea with it. 基本上,从代码的外观来看,您正在尝试或已经实现了CardLayout ,不幸的是,您对它的想法有点错误。

With CardLayout , you need to "controller", a component that is responsible for switching the screens... 使用CardLayout ,您需要“控制器”,该组件负责切换屏幕...

public class ScreenController extends JPanel {

    private static final long serialVersionUID = 1L;
//-------------VARIABLES---------------//
    MenuScreen ms = new MenuScreen();
    GameScreen gs = new GameScreen();
    CardLayout sceneChange;

//-------------CONSTRUCTOR-------------//
    public ScreenController() {

        sceneChange = new CardLayout();

        this.setLayout(sceneChange);
        add(ms, "menuScreen");
        add(gs, "gameScreen");

        sceneChange.show(this, "menuScreen");

        ms.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equalsIgnoreCase("startgame")) {
                    sceneChange.show(ScreenController.this, "gameScreen");
                }
            }
        });
    }

}//END OF CLASS startingScreen

Then you have your menu and game screens... 然后,您便有了菜单和游戏屏幕...

public class MenuScreen extends JPanel implements MouseListener {

    private static final long serialVersionUID = 1L;
//-------------VARIABLES---------------//
    //JButton start = new JButton(basketball);
    JLabel options = new JLabel("Options");
    JLabel startGame = new JLabel(" >> Start << ");
//    gameScreen gS = new gameScreen();
    BufferedImage wallpaper;

//-------------PAINT FUNCTION----------//
    @Override
    public void paintComponent(Graphics g) {
        System.out.println("paint");
        super.paintComponent(g);
        if (wallpaper != null) {
            g.drawImage(wallpaper, 0, 0, this);
        }
    }

//-------------CONSTRUCTOR-------------//
    public MenuScreen() {

        // Please handle your exceptions better
        try {
            wallpaper = ImageIO.read(getClass().getResource("/Menu.png"));
            setPreferredSize(new Dimension(wallpaper.getWidth(), wallpaper.getHeight()));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        setLayout(new GridBagLayout());

        Cursor cusor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
        options.setCursor(cusor);
        startGame.setCursor(cusor);

        Font font = UIManager.getFont("Label.font").deriveFont(Font.BOLD, 48);
        options.setFont(font);
        startGame.setFont(font);

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;

        this.add(options, gbc);
        gbc.gridy++;
        this.add(startGame, gbc);
        startGame.addMouseListener(this);
        options.addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == (startGame)) {
            fireActionPerformed("startGame");
        }
        if (e.getSource() == (options)) {
            fireActionPerformed("gameOptions");
        }
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void addActionListener(ActionListener listener) {
        listenerList.add(ActionListener.class, listener);
    }

    public void removeActionListener(ActionListener listener) {
        listenerList.remove(ActionListener.class, listener);
    }

    protected void fireActionPerformed(String cmd) {
        ActionListener[] listeners = listenerList.getListeners(ActionListener.class);
        if (listeners != null && listeners.length > 0) {
            ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, cmd);
            for (ActionListener listener : listeners) {
                listener.actionPerformed(evt);
            }
        }
    }
}

Menu Screen... 菜单屏幕...

菜单画面

And when you click start...the game screen... 然后单击开始...游戏屏幕...

在此处输入图片说明

Now this is an EXAMPLE. 现在这是一个例子。 Please try and take the time to understand what it going on in the code before you march ahead and implement it. 在继续前进并实施之前,请尝试并花一些时间了解代码中的内容。 I used by own images, you'll need to get your own.. 我使用了自己的图片,则需要自己制作图片。

There are several ways to stop your JPanel from "appearing" depending on exactly what you want to accomplish. 有多种方法可以阻止JPanel出现,具体取决于您要完成的工作。 One was it to to call setOpaque(false); 一种是调用setOpaque(false); . I'm not entirely sure how this affects custom painting, though. 不过,我不太确定这会如何影响自定义绘画。

Another posibility is 另一个可能性是

Container parent = getParent().remove(this);
parent.validate();

A third posibility is to add a flag in your class which is set when you click on a JLabel (or better yet a JButton -- see comments below). 第三种可能性是在类中添加一个标志,该标志是在单击JLabel(或更好的JButton,请参见下面的注释)时设置的。 Then in your paintComponent() method you can check the flag and draw accordingly. 然后,在paintComponent()方法中,您可以检查标志并进行相应绘制。

Note: 注意:

You are incorrectly using a JLabel and mouse events to respond to user input. 您错误地使用了JLabel和鼠标事件来响应用户输入。 Typically in a Swing application, we use JButtons and ActionListeners to accomplish what you are trying to do here. 通常,在Swing应用程序中,我们使用JButtons和ActionListeners完成您在此处尝试做的事情。 One advantage of this is that you only have to implement one method called onActionPerformed() and don't need to worry about adding all the mouse event handlers that you don't want to even respond to. 这样的优点之一是,您只需实现一种名为onActionPerformed()方法,而不必担心添加所有您不想响应的鼠标事件处理程序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM