我正在嘗試用Java編寫一個屏幕管理器 - 我是一個新手。這個類(ScreenManager)應該能夠接受一個類的類型然後實例化它。它更容易使用代碼來解釋的話,我希望能夠做到這一點:如何將Java類封裝/轉換爲父類類型?
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
MenuScreen延伸的類稱爲屏幕延伸的JFrame。我的想法是讓AScreen,BScreen,CScreen等都擴展屏幕,以便我可以將它們投射到屏幕並將它們存儲爲單一類型。
所以屏幕管理是這樣的:
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();
}
}
});
}
}
屏幕簡直是,所有AScreen,BScreen等已經是在它們的構造一些初始化代碼。
import javax.swing.JFrame;
public class Screen extends JFrame {
private static final long serialVersionUID = 1L;
}
我上傳遞類類型的屏幕管理類絆位。
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
現在我可以投它像這樣:
Screen s = new MenuScreen();
但我似乎無法通過類的類型。我試着投它,像這樣:
manager.setCurrentScreen((Screen.class)MenuScreen.class);
這是行不通的。我只是來自C#背景,所以我的觀點可能(也可能是)錯誤。如果是這樣,請糾正我。
感謝您的閱讀!
爲什麼不只是manager.setCurrentScreen(new MenuScreen())? – Matsemann
是的,那部分也讓我感到困惑。 Java在一個相對簡單的應用程序中很少與實際的類相提並論,而不是該類的實例。 – Marvo
我的印象是我需要用'javax.swing.SwingUtilities.invokeLater'運行,看到這個:http://stackoverflow.com/questions/6567870/what-does-swingutilities-invokelater-do –