Java로 화면 관리자를 작성하려고합니다. 새로운 언어입니다. 이 클래스 (ScreenManager)는 클래스 유형을 가져 와서 인스턴스화 할 수 있어야합니다. 너무 코드를 설명하기 쉽게, 나는이 작업을 수행 할 수 있도록하려면 :Java 클래스를 상위 클래스 유형으로 박스/캐스트하는 방법은 무엇입니까?
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
MenuScreen는 JFrame의를 확장하는 클래스라는 화면을 확장합니다. 내 생각은 AScreen, BScreen, CScreen 등 모든 Screen을 확장하여 스크린에 캐스팅하고 하나의 단일 유형으로 저장할 수 있도록하는 것입니다.
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 등이 자신의 생성자에서 일부 초기화 코드 :
그래서 ScreenManager로이 같다.
import javax.swing.JFrame;
public class Screen extends JFrame {
private static final long serialVersionUID = 1L;
}
나는 ScreenManager로 클래스에 클래스 형을 통과에 걸림돌하고 비트.
Screen s = new MenuScreen();
을하지만 클래스 유형을 전달할 수없는 것 :
ScreenManager manager = new ScreenManager();
manager.setCurrentScreen(MenuScreen.class);
manager.runScreen();
지금은과 같이 캐스팅 할 수 있습니다. 나는 그것을 이렇게 던지려고 노력했다 :
manager.setCurrentScreen((Screen.class)MenuScreen.class);
그것은 작동하지 않는다.
참고로 C# 배경에서 왔기 때문에 내 관점이 잘못되었을 수 있습니다. 그렇다면, 저를 시정하십시오.
지금까지 읽어 주셔서 감사합니다.
왜 manager.setCurrentScreen (새 MenuScreen())이 아닌가? – Matsemann
그래, 그 부분도 나 혼란 스럽다. 상대적으로 단순한 응용 프로그램에서 Java가 해당 클래스의 인스턴스가 아닌 실제 클래스를 소란스럽게 다루는 경우는 거의 없습니다. – Marvo
나는 javax.swing.SwingUtilities.invokeLater'로 실행해야한다는 인상을 받았다. 이것을 보시라 : http://stackoverflow.com/questions/6567870/what-does-swingutilities-invokelater-do –