Tôi đang thực hành lập trình kiểu MVC. Tôi có một trò chơi Mastermind trong một tập tin duy nhất, làm việc tốt (có thể ngoài thực tế là "Kiểm tra" nút là vô hình lúc bắt đầu).GUI không hoạt động sau khi viết lại cho MVC
http://paste.pocoo.org/show/226726/
Nhưng khi tôi đã viết lại nó để mô hình, xem, file điều khiển - và khi tôi bấm vào trống Pin (cần được cập nhật, và sơn lại với màu sắc mới) - ghi nhận xảy ra. Ai có thể nhìn thấy bất kỳ vấn đề ở đây? Tôi đã thử đặt sơn lại() ở những nơi khác nhau, nhưng nó chỉ đơn giản không hoạt động tại tất cả:/
chính:
public class Main {
public static void main(String[] args){
Model model = new Model();
View view = new View("Mastermind", 400, 590, model);
Controller controller = new Controller(model, view);
view.setVisible(true);
}
}
mẫu:
import java.util.Random;
public class Model{
static final int
LINE = 5,
SCORE = 10, OPTIONS = 20;
Pin pins[][] = new Pin[21][LINE];
int combination[] = new int[LINE];
int curPin = 0;
int turn = 1;
Random generator = new Random();
int repaintPin;
boolean pinsRepaint=false;
int pinsToRepaint;
boolean isUpdate = true, isPlaying = true, isRowFull = false;
static final int HIT_X[] = {270,290,310,290,310}, HIT_Y[] = {506,496,496,516,516};
public Model(){
for (int i=0; i < SCORE; i++){
for (int j = 0; j < LINE; j++){
pins[i][j] = new Pin(20,0);
pins[i][j].setPosition(j*50+30,510-i*50);
pins[i+SCORE][j] = new Pin(8,0);
pins[i+SCORE][j].setPosition(HIT_X[j],HIT_Y[j]-i*50);
}
}
for (int i=0; i < LINE; i++){
pins[OPTIONS][i] = new Pin(20, i+2);
pins[OPTIONS][i].setPosition(370,i * 50 + 56);
}
}
void fillHole(int color) {
pins[turn-1][curPin].setColor(color+1);
pinsRepaint = true;
pinsToRepaint = turn;
curPin = (curPin+1) % LINE;
if (curPin == 0){
isRowFull = true;
}
pinsRepaint = false;
pinsToRepaint = 0;
}
void check() {
int junkPins[] = new int[LINE], junkCode[] = new int[LINE];
int pinCount = 0, pico = 0;
for (int i = 0; i < LINE; i++) {
junkPins[i] = pins[turn-1][i].getColor();
junkCode[i] = combination[i];
}
for (int i = 0; i < LINE; i++){
if (junkPins[i]==junkCode[i]) {
pins[turn+SCORE][pinCount].setColor(1);
pinCount++;
pico++;
junkPins[i] = 98;
junkCode[i] = 99;
}
}
for (int i = 0; i < LINE; i++){
for (int j = 0; j < LINE; j++)
if (junkPins[i]==junkCode[j]) {
pins[turn+SCORE][pinCount].setColor(2);
pinCount++;
junkPins[i] = 98;
junkCode[j] = 99;
j = LINE;
}
}
pinsRepaint = true;
pinsToRepaint = turn + SCORE;
pinsRepaint = false;
pinsToRepaint=0;
if (pico == LINE){
isPlaying = false;
}
else if (turn >= 10){
isPlaying = false;
}
else{
curPin = 0;
isRowFull = false;
turn++;
}
}
void combination() {
for (int i = 0; i < LINE; i++){
combination[i] = generator.nextInt(6) + 1;
}
}
}
class Pin{
private int color, X, Y, radius;
public Pin(){
X = 0; Y = 0; radius = 0; color = 0;
}
public Pin(int r,int c){
X = 0; Y = 0; radius = r; color = c;
}
public int getX(){
return X;
}
public int getY(){
return Y;
}
public int getRadius(){
return radius;
}
public void setRadius(int r){
radius = r;
}
public void setPosition(int x,int y){
this.X = x ;
this.Y = y ;
}
public void setColor(int c){
color = c;
}
public int getColor() {
return color;
}
}
Xem:
import java.awt.*;
import javax.swing.*;
public class View extends Frame{
Model model;
JButton checkAnswer;
private JPanel button;
private static final Color COLORS[] = {Color.black, Color.white, Color.red, Color.yellow, Color.green, Color.blue, new Color(7, 254, 250)};
public View(String name, int w, int h, Model m){
model = m;
setTitle(name);
setSize(w,h);
setResizable(false);
this.setLayout(new BorderLayout());
button = new JPanel();
button.setSize(new Dimension(400, 100));
button.setVisible(true);
checkAnswer = new JButton("Check");
checkAnswer.setSize(new Dimension(200, 30));
button.add(checkAnswer);
this.add(button, BorderLayout.SOUTH);
button.setVisible(true);
}
@Override
public void paint(Graphics g) {
g.setColor(new Color(238, 238, 238));
g.fillRect(0,0,400,590);
for (int i=0; i < model.pins.length; i++) {
paintPins(model.pins[i][0],g);
paintPins(model.pins[i][1],g);
paintPins(model.pins[i][2],g);
paintPins(model.pins[i][3],g);
paintPins(model.pins[i][4],g);
}
}
@Override
public void update(Graphics g) {
if (model.isUpdate) {
paint(g);
}
else {
model.isUpdate = true;
paintPins(model.pins[model.repaintPin-1][0],g);
paintPins(model.pins[model.repaintPin-1][1],g);
paintPins(model.pins[model.repaintPin-1][2],g);
paintPins(model.pins[model.repaintPin-1][3],g);
paintPins(model.pins[model.repaintPin-1][4],g);
}
}
void repaintPins(int pin) {
model.repaintPin = pin;
model.isUpdate = false;
repaint();
}
public void paintPins(Pin p, Graphics g){
int X = p.getX();
int Y = p.getY();
int color = p.getColor();
int radius = p.getRadius();
int x = X-radius;
int y = Y-radius;
if (color > 0){
g.setColor(COLORS[color]);
g.fillOval(x,y,2*radius,2*radius);
}
else{
g.setColor(new Color(238, 238, 238));
g.drawOval(x,y,2*radius-1,2*radius-1);
}
g.setColor(Color.black);
g.drawOval(x,y,2*radius,2*radius);
}
}
Bộ điều khiển:
import java.awt.*;
import java.awt.event.*;
public class Controller implements MouseListener, ActionListener {
private Model model;
private View view;
public Controller(Model m, View v){
model = m;
view = v;
view.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
} });
view.addMouseListener(this);
view.checkAnswer.addActionListener(this);
model.combination();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == view.checkAnswer){
if(model.isRowFull){
model.check();
}
}
}
public void mousePressed(MouseEvent e) {
Point mouse = new Point();
mouse = e.getPoint();
if (model.isPlaying){
if (mouse.x > 350) {
int button = 1 + (int)((mouse.y - 32)/50);
if ((button >= 1) && (button <= 5)){
model.fillHole(button);
if(model.pinsRepaint){
view.repaintPins(model.pinsToRepaint);
}
}
}
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
Cả mã cũ và mới đều có vấn đề liên quan đến việc trộn các thành phần AWT và Swing. Xem thêm http://stackoverflow.com/questions/2687871 – trashgod
để vấn đề không cập nhật có thể do điều đó? –
Có. http://java.sun.com/products/jfc/tsc/articles/mixing/ – trashgod