【问题标题】:Image not appearing in JFrame after being added by Timer event由 Timer 事件添加后图像未出现在 JFrame 中
【发布时间】:2014-04-26 16:56:54
【问题描述】:

我有一个 JFrame,其中包含一个带有 JButton“Press Me”的 JPanel

按下“Press me”按钮将在同一个 JFrame 中切换到另一个 JPanel(SecondPanel)

我有一个 Timer 函数,它将向 JFrame 添加另一张卡片,该函数将在 6 秒后运行。

问题是我必须先展开或最小化 JFrame 窗口,然后卡片才会出现在 JFrame 中。我希望卡片出现在 JFrame 中而不展开或最小化 JFrame 窗口

谁能帮我解决这个问题并向我解释发生了什么

谢谢

用于运行项目的主类

package testing;

import java.io.*;
import java.security.*;
import javax.xml.bind.DatatypeConverter;
import java.lang.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;


public class Testing extends JPanel 
{



    public static void main(String[] args) 
    {
        frame = new JFrame();
        LoginPanel lp = new LoginPanel();
        frame.add(lp);
        frame.pack();
        frame.validate();
        frame.setVisible(true);

    }

   static JFrame frame;
}

LoginPanel 类

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

public class LoginPanel extends JPanel
{
    LoginPanel()
    {
        Loginbtn = new JButton("Press Me");
        Loginbtn.addActionListener(new LoginButtonListener());
        add(Loginbtn);


    }

     private class LoginButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {

            SecondPanel sp = new SecondPanel();
            Utility.ChangePanel(sp);
            sp.run();
        }
    }

    JButton Loginbtn;

}

SecondPanel 类

package testing;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;


public class SecondPanel extends JPanel
{
    SecondPanel()
    {
        setLayout(new GridLayout(2,2));

        //set deck image
        File deckfile = new File("./src/testing/Ace_Club_1_1.png"); //deck image file location

        try
        {    
          Deckimg = ImageIO.read(deckfile); //read deck image


        }

        catch (IOException e)
        {

        }

         Image scaledInstance = Deckimg.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
         DeckLabel = new JLabel(new ImageIcon(scaledInstance));
         add(DeckLabel);

    }

    public void run()
    {
        Timer timer = new Timer(5000, new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent arg0) 
            {
                // Code to be executed
                File Diamondfile = new File("./src/testing/Ace_Diamond_1_1.png"); //deck image file location

        try
        {    
          Diamondimg = ImageIO.read(Diamondfile); //read deck image


        }

        catch (IOException e)
        {

        }

         Image scaledInstance = Diamondimg.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
         DiamondLabel = new JLabel(new ImageIcon(scaledInstance));
         add(DiamondLabel);

            }
        });
        timer.setRepeats(false); // Only execute once
        timer.start(); // Go go go!



    }

    JLabel DeckLabel;
    JPanel DeckPanel;
    BufferedImage Deckimg;

    JLabel DiamondLabel;
    JPanel DiamondPanel;
    BufferedImage Diamondimg;



}

用于在 JFrame 中切换 JPanel 的实用程序类

package testing;

import java.security.MessageDigest;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Utility 
{    
    public static void ChangePanel(JPanel jp)
    {


        testing.Testing.frame.getContentPane().removeAll();
        testing.Testing.frame.add(jp);
        testing.Testing.frame.validate();


    }

}

【问题讨论】:

    标签: java image debugging timer jframe


    【解决方案1】:

    在这一行之后:

    add(DiamondLabel);
    

    添加:

    revalidate();
    repaint();
    

    这将告诉包含 JPanel 重新布局它拥有的所有组件,然后重新绘制自身。

    【讨论】:

    猜你喜欢
    • 2016-02-22
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多