有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你把事情搞混了:MazePanel和名为“canvas”的JPanel都是可以“绘制”的组件。显然,当您试图绘制“canvas”组件时,您正在调用类MazePanel中的paintComponent方法。我猜你想要的是画“画布”组件

    在不太投入Swing的情况下,我认为无论如何调用方法paintComponent都是错误的。您应该做的是实现自己的JPanel子类,然后重写paintComponent方法。每当需要重新绘制该组件时,就调用名为“repaint”的方法

    摇摆中的绘画:http://www.oracle.com/technetwork/java/painting-140037.html#swing