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
。任何幫助感謝!
首先,您應該創建一個指向類View的實例的鏈接,然後使用該類的變量repaint。 –
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
回答你的問題:在'actionPerformed()'方法內的View類的'main()'方法內移動代碼 – Frakcool