java黑框动作后事件和许多观察者
我正试图在我的java应用程序中实现MVC和Observer模式。我有一个应用程序,可以创建一个迷宫,也可以解决它
基本上,我已经发现notifyObserver()调用按预期工作。点击“创建”按钮后,迷宫将被打印出来。但在活动结束时,整个画面变黑了,我不知道为什么
请参见panel对象的有趣部分:
public class MazePanel extends JPanel implements Observer {
.....some instance vars ect.....
public void buildFrame(){
// create the frame
JFrame frame = new JFrame("Labyrinth Solver");
// create the JPanel
canvas = new JPanel();
canvas.setBorder(BorderFactory.createEmptyBorder(1000, 1000, 1000, 1000));
canvas.setPreferredSize(new Dimension(getDimension()*zoom, getDimension()*zoom));
// add the canvas to the frame and make it visible
frame.add(canvas);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
frame.setBackground(Color.black);
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
if(mode.equals("create")) {
g.setColor(Color.white);
}
g.fillRect(curCoordinate.getX()*zoom, curCoordinate.getY()*zoom, 1*zoom, 1*zoom );
}
@Override
public void update(Observable observable, Object o) {
curCoordinate = (Coordinate)o;
paintComponent(canvas.getGraphics());
try {
Thread.sleep(getSpeed());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
查看我的控制器,了解动作事件:
public class MazeController {
private MazeModel model;
private MazeView view;
private MazePanel mazePanel;
private Builder mazeBuilder;
public MazeController(MazeModel model, MazeView view) {
this.model = model;
this.view = view;
mazePanel = new MazePanel();
// Create Gui
view.createAndShowGUI();
// Add Listeners
view.addChangeSpeedListener(new SpeedChangeAction());
view.addCreateListener(new CreateActionListener());
}
private class CreateActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// Configure the MazePanel object
mazePanel.setMode("create");
mazePanel.setZoom(view.getZoom());
mazePanel.setDimension(view.getDimension());
mazePanel.setSpeed(view.getSpeed());
// Build panel
mazePanel.buildFrame();
// Get Build Type
String createAlgorithm = view.getCreateAlgorithm();
// Build selected maze
if (createAlgorithm.equals("Depth-First")) {
mazeBuilder = new DepthFirstSearch(model, view.getDimension());
}
// Register observer
mazeBuilder.registerObserver(mazePanel);
// Build Maze
mazeBuilder.build();
// print data strucutre as array if debugging is enabled
if(view.getDebug()){
model.printAsArray();
}
}
}
实际上,这里也有代码:https://github.com/do3meli/Labyrinth/tree/MVC/src/main/java/ch/zhaw/labyrinth
# 1 楼答案
你把事情搞混了:MazePanel和名为“canvas”的JPanel都是可以“绘制”的组件。显然,当您试图绘制“canvas”组件时,您正在调用类MazePanel中的paintComponent方法。我猜你想要的是画“画布”组件
在不太投入Swing的情况下,我认为无论如何调用方法paintComponent都是错误的。您应该做的是实现自己的JPanel子类,然后重写paintComponent方法。每当需要重新绘制该组件时,就调用名为“repaint”的方法
摇摆中的绘画:http://www.oracle.com/technetwork/java/painting-140037.html#swing