2017-06-14 126 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() { 
     ... 
    } 
} 

但是,如果你想在另一個框架是另一個進程嵌入視圖幀的內容。

相關問題