У меня есть JFrame, который содержит JPanel с JButton "Press Me"
Нажатие кнопки "Press me" изменится на другую JPanel (SecondPanel) в пределах того же JFrame
У меня есть функция таймера, которая добавит еще одну карту в 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;
}
Класс полезности, используемый для переключения JPanels внутри JFrame
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();
}
}
После этой строки:
add(DiamondLabel);
Добавить:
revalidate();
repaint();
Это сообщит содержащему JPanel о повторной компоновке всех компонентов, которые он имеет, а затем перекрасит сам.