2017-06-14 125 views
0

因此我有一个读取2D Char数组的接口,并且应该在新创建的窗口中绘制图形图形。如何将JButton动作监听器链接到另一个类的接口

下面的代码:

class View extends JFrame { 

     private final List<Integer> path = new ArrayList<Integer>(); 
     private int pathIndex; 

     private View() { 
      setTitle("Simple Maze Solver"); 
      setSize(640, 480); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

      //DepthFirst.searchPath(storelab, 1, 1, path); 
      pathIndex = path.size() - 2; 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     g.translate(50, 50); 

     // draws the maze 
     for (int row = 0; row < storelab.length; row++) { 
      for (int col = 0; col < storelab[0].length; col++) { 
       Color color; 
       switch (storelab[row][col]) { 
        case 1 : color = Color.BLACK; break; 
        case 9 : color = Color.RED; break; 
        default : color = Color.WHITE; 
       } 
       g.setColor(color); 
       g.fillRect(30 * col, 30 * row, 30, 30); 
       g.setColor(Color.BLACK); 
       g.drawRect(30 * col, 30 * row, 30, 30); 
      } 
     } 

     // draw the path list 
     for (int p = 0; p < path.size(); p += 2) { 
      int pathX = path.get(p); 
      int pathY = path.get(p + 1); 
      g.setColor(Color.GREEN); 
      g.fillRect(pathX * 30, pathY * 30, 30, 30); 
     } 

     // draw the ball on path 
     int pathX = path.get(pathIndex); 
     int pathY = path.get(pathIndex + 1); 
     g.setColor(Color.RED); 
     g.fillOval(pathX * 30, pathY * 30, 30, 30); 
    } 

    @Override 
    protected void processKeyEvent(KeyEvent ke) { 
     if (ke.getID() != KeyEvent.KEY_PRESSED) { 
      return; 
     } 
     if (ke.getKeyCode() == KeyEvent.VK_RIGHT) { 
      pathIndex -= 2; 
      if (pathIndex < 0) { 
       pathIndex = 0; 
      } 
     } 
     else if (ke.getKeyCode() == KeyEvent.VK_LEFT) { 
      pathIndex += 2; 
      if (pathIndex > path.size() - 2) { 
       pathIndex = path.size() - 2; 
      } 
     } 
     repaint(); 
    } 

    public void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       View view = new View(); 
       view.setVisible(true); 


      } 


     }); 

    } 
} 
} 

它应该做一个图形绘制。现在,在另一个课程中,您可能会猜到,我的Interface类,D,我有一个按钮的接口,现在我的问题是,如何将我的数组的图形图形链接到Interface类中的按钮?当我点击那个按钮时,它应该触发JFrame类。

下面是它的一个相关片段:

public static void main(String[] args) { 
    Ch14JButtonFrame frame = new Ch14JButtonFrame(); 
    frame.setVisible(true); 
} 

public Ch14JButtonFrame() { 

    /*Vai ser definido os parametros (dimensoes, titulo, etc.) da iterface*/ 
    Container contentPane = getContentPane(); 
    setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    setResizable(true); 
    setTitle("Jogo do Labirinto 37732 37861"); 
    setLocation(FRAME_X_ORIGIN, FRAME_Y_ORIGIN); 
    contentPane.setLayout(new FlowLayout()); 


    **showButton = new JButton("Show Labyrinth"); 
    contentPane.add(showButton); 
    showButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 

     }** 
    }); 

这是应该trigget它的按钮,命名为showButton。任何帮助感谢!

+0

首先,您应该创建一个指向类View的实例的链接,然后使用该类的变量repaint。 –

+0

1)不要扩展'JFrame',它是一个不能放在其他容器内的刚性容器,而是扩展'JPanel',并绘制它,然后将该面板添加到框架。参见[在类中扩展jframe vs创建](https://stackoverflow.com/questions/22003802/extends-jframe-vs-creating-it-inside-the-program)。与(1)相关,不要覆盖'paint(...)',而是覆盖'paintComponent'。 3)不要调用'setSize(...)',而是重写'getPreferredSize(...)'方法并调用'pack()'。 4)不要使用Key Listener,而要使用Key Bindings。 – Frakcool

+0

回答你的问题:在'actionPerformed()'方法内的View类的'main()'方法内移动代码 – Frakcool

回答

0

如果你想在新窗口中打开框架,你可以这样做:

showButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     new View().setVisible(true); 
    } 
}); 

还必须更改您的视图类公众,也是构造函数。

public class View extends JFrame { 
    ... 
    public View() { 
     ... 
    } 
} 

但是,如果你想在另一个框架是另一个进程嵌入视图帧的内容。

相关问题