I am trying to write a screen manager in Java - a language I am new to. This class (ScreenManager) should be able to take a class type and then instantiate it. It's easier to explain with code so, I want to be able to do this:
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
MenuScreen extends a class called Screen which extends JFrame. My idea is to have AScreen, BScreen, CScreen etc all extend Screen so I can cast them to Screen and store them as one single type.
So ScreenManager is like this:
import javax.swing.UIManager;
public class ScreenManager {
private Class<Screen> _currentScreen;
private Screen _currentScreenObject;
public ScreenManager() { }
public ScreenManager(Class<Screen> screen) {
setCurrentScreen(screen);
}
public Class<Screen> getCurrentScreen() {
return _currentScreen;
}
public void setCurrentScreen(Class<Screen> screen) {
_currentScreen = screen;
}
public void runScreen() {
if (_currentScreen == null) return;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
UIManager.put("swing.boldMetal", Boolean.FALSE);
try {
_currentScreenObject = _currentScreen.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
});
}
}
Screen is simply, and all AScreen, BScreen etc have is some initialisation code in their constructors.
import javax.swing.JFrame;
public class Screen extends JFrame {
private static final long serialVersionUID = 1L;
}
The bit I am stumbling on is passing the class type to the ScreenManager class.
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
Now I can cast it like so:
Screen s = new MenuScreen();
But I can't seem to pass the class type. I've tried to cast it like so:
manager.setCurrentScreen((Screen.class)MenuScreen.class);
That doesn't work.
FYI, I come from a C# background, so my perspective may (and probably is) wrong. If so, please correct me.
Thanks for reading this far!