1
我不知道如果我正在做一个适当的MVC,但我不能执行Clear()
从我的看法。MVC函数错误,当按钮通过试图从JComponent调用函数
主要
public class Main{
public static void main(String[] args) {
Model model = new Model();
final View view = new View();
Controller controller = new Controller(view, model);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
view.showView();
}
});
}
}
型号
public class Model {
DrawPad drawPad = new DrawPad();
Model() {
}
public void Clear() {
drawPad.clear();
System.out.print("HELP");
}
}
查看
public class View extends JFrame {
JButton clearButton = new JButton("Clear");
DrawPad drawPad = new DrawPad();
Model model;
public void showView() {
JFrame frame = new JFrame();
drawPad.DrawPad();
frame.add(drawPad, BorderLayout.CENTER);
frame.add(clearButton, BorderLayout.SOUTH);
frame.setSize(280, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void addButtonActionListener(ActionListener clr) {
clearButton.addActionListener(clr);
}
}
控制器
public class Controller implements ActionListener {
View view;
Model model;
Controller(View v, Model m) {
this.view = v;
this.model = m;
view.addButtonActionListener(this);
}
public void actionPerformed(ActionEvent e) {
model.Clear();
System.out.print("H");
}
}
JComponent的
class DrawPad extends JComponent {
Image image;
public Graphics2D graphics2D;
int currentX, currentY, oldX, oldY;
public void DrawPad() {
setDoubleBuffered(false);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
oldX = e.getX();
oldY = e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
currentX = e.getX();
currentY = e.getY();
if (graphics2D != null)
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
}
});
}
public void paintComponent(Graphics g) {
if (image == null) {
image = createImage(getSize().width, getSize().height);
graphics2D = (Graphics2D) image.getGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
g.drawImage(image, 0, 0, null);
}
public void clear() {
System.out.println("Test");
graphics2D.setPaint(Color.white);
graphics2D.fillRect(0, 0, getSize().width, getSize().height);
graphics2D.setPaint(Color.black);
repaint();
}
}
如果我使用我的看法事件侦听器,并创建一个drawPad
并直接调用clear()
,我能够执行。但是,当我调用清晰的模型和控制器时,会引发错误。
任何想法,如果我做错了什么?也许我错过了什么?
的模型和视图应该没有概念控制器在两者之间起到新娘的作用,这意味着模型将需要触发某些事件,控制器将对此作出响应,这会导致控制器在视图上调用“清除”... – MadProgrammer
给予您的模型SwingPropertyChangeSupport o然后通过制作“绑定”属性来使用它,通过改变时通知支持对象的属性,可以帮助解决@MadProgrammer上面提到的问题。您还必须为外部类提供一种机制,以在需要时将PropertyChangeListeners添加到此支持对象。 –
还有一些问题:'paintComponent'应该被保护,而不是公共的,它应该有一个'@ Override'注释,并且你应该在其中调用'super.paintComponent(...)'方法。 –