我有一个持有框架和JMenu的主类,以及从JPanel扩展的另一个游戏类。如何从jMenu点击一个选项创建一个新游戏?
目前,我有这个
class Application {
private static Game game;
private static TheFrame frame;
private static JMenuBar menu;
public Application(){
frame = new TheFrame();
menu = new JMenuBar();
JMenu file = new JMenu("File");
menu.add(file);
frame.setJMenuBar(menu);
JMenuItem newGame = new JMenuItem("New Game");
newGame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
newGame();
}
});
file.add(newGame);
JMenuItem scores = new JMenuItem("Show Scores");
scores.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Score();
}
});
file.add(scores);
JMenuItem exit = new JMenuItem("Exit!");
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
file.add(exit);
}
private void newGame(){
// frame.getContentPane().removeAll();
frame.getContentPane().setBackground(Color.pink);
game = new Game();
frame.addGameToCanvas(game);
game.runMenu();
}
/**
* Main method
* @param args
*/
public static void main(String args[]) {
Application app = new Application();
}
}
但是当我点击新游戏时,框架会变黑,并且不会显示任何内容。我在命令行之前有这个,并且一切正常,但是当我尝试使用菜单执行此操作时不起作用。有什么建议吗?
修改
frame.addGametoCanva()的代码。它的作用是将游戏对象添加到画布中。 public void addGameToCanvas(Game g){ canvas = g; add(canvas,BorderLayout.CENTER); 无效(); 验证(); 重绘(); }
是的,游戏对象有一个有限的循环,用于用户输入(来自控制台)
答案 0 :(得分:0)
游戏对象,具有有限循环,用于用户输入(来自控制台)
Event-Dispatch线程(EDT)是单线程的 - 它负责绘画,事件处理等......如果有人试图在这个线程上执行长时间运行的任务,比如等待来自不同来源的用户输入(像控制台一样)EDT可以锁定(换句话说是无响应的UI)。
任何长时间运行的任务都应放在自己的Thread内,或通过SwingWorker运行。此外,应使用SwingUtilities package demo;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ListView;
public class DoctorController implements Initializable {
@FXML
private TableView<Doctor> doctorsTable;
@FXML
private TableColumn<Doctor, String> docNameCol;
@FXML
private TableColumn<Doctor, String> docDeptCol;
@FXML
private TableColumn<Doctor, String> docSalaryCol;
@FXML
private TableColumn<Doctor, String> docPhoneCol;
@FXML
private ListView<String> doctorList;
private Connection con;
private Statement stat;
private ResultSet res;
private String query;
private String fname;
private String fdept;
private String fsalary;
private String fphone;
DatabaseConnection dbobj = new DatabaseConnection();
private void connect() throws SQLException{
con=dbobj.getConn();
stat=dbobj.getState();
}
private void init(){
docNameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
docDeptCol.setCellValueFactory(new PropertyValueFactory<>("dept"));
docSalaryCol.setCellValueFactory(new PropertyValueFactory<>("salary"));
docPhoneCol.setCellValueFactory(new PropertyValueFactory<>("phone"));
}
@Override
public void initialize(URL url, ResourceBundle rb) {
init();
try {
populateTable();
System.out.println("items added");
} catch (SQLException ex) {
Logger.getLogger(DoctorController.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void populateTable() throws SQLException{
ObservableList<Doctor> tableVlues = FXCollections.observableArrayList();
ObservableList<String> list = FXCollections.observableArrayList();
connect();
query = "Select * from Doctor";
res = stat.executeQuery(query);
tableVlues.add(new Doctor());
while(res.next()){
fname = res.getString("doctorName");
fdept = res.getString("doctorDept");
fsalary = res.getString("doctorSalary");
fphone = res.getString("doctorPhone");
System.out.println(fname+", "+fdept+" , "+fsalary+" , "+fphone); // This line prints everything correctly
tableVlues.add(new Doctor(fname, fdept, fsalary, fphone));
list.add(fname+", "+fdept+" , "+fsalary+" , "+fphone);
}
doctorList.setItems(list);
doctorsTable.setItems(tableVlues);
}
}
或invokeLater
将{em>非EDT线程上的大多数调用发送到EDT(这包括构建UI - 注意main方法在非EDT线程上运行。
虽然,我不完全确定为什么混合使用UI(例如Console 和 Swing) - 您可能会考虑只选择一个UI。