程序中有四个面板,这些面板应该允许我以不同的方式修改屏幕上绘制的椭圆形状。它们似乎能够很好地工作,经过一番努力,我成功将它们显示在包含整个程序的JFrame窗口中。但是,如果我按照提供的说明进行操作,我只能看到一个空的框架。而如果我自己编写代码,则无法更新椭圆形状。
这个项目有非常具体的说明,我也一直遵循指导,但部分文档并不清晰。我认为我缺少的必须是某些简单的东西,因为没有任何问题跳出来让我感到困惑。然而,我得承认我的Java经验有限,对GUI设计和范例也几乎没有接触过。
总之,我已经在网上和这个网站上广泛搜索,试图找出问题所在,但这是一个相当特殊的例子,老实说,我根本就不了解这方面的知识,也无法从网上找到通用的答案,并弄清楚缺失了什么。我已经花费了太长时间来查看此代码,所以非常希望有人能帮助我。
public class Model {
private Controller controller;
private View view;
private MvcFrame mvcFrame;
private int radius = 44;
private Color color = Color.BLUE;
private boolean solid = true;
//bunch of mutators and accessors for the above variables
public Model() {
controller = new Controller(this);
view = new View(this);
mvcFrame = new MvcFrame(this);
}
}
这是模型类。它看起来相当简单。我认为我的理解很扎实,没有任何错误。主要包含上下文信息。
public class Controller extends JPanel{
private Model model;
public Controller(Model model) {
this.model = model;
setBorder(BorderFactory.createLineBorder(Color.GREEN));
setLayout(new GridLayout(4,1));
add(new RadiusPanel(model));
add(new ColorPanel(model));
add(new SolidPanel(model));
add(new TitlePanel(model));
}
}
这是控制器类。据我所知,setBorder、setLayout和一系列的adds在这里没有作用。我把它们注释掉了,但这是指令告诉我要这样做的方式,所以要么有一个错误,要么是我的设置有问题。然而,当我这样做时,我会得到一个空窗口(JFrame),但其中没有任何面板显示出来。我为解决这个问题是将这些add函数放到mvcFrame类中:
public class MvcFrame extends JFrame {
private Model model;
public MvcFrame(Model model){
this.model = model;
//setLayout(new GridLayout(4,1));
//add(new RadiusPanel(model));
//add(new ColorPanel(model));
//add(new SolidPanel(model));
//add(new TitlePanel(model));
//add(new View(model));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(800,600);
setVisible(true);
}
}
所以,这里的事情开始变得有点奇怪。第一个被注释掉的代码块与Controller类中的代码相同。我将其注释掉的原因是因为那只是一个幸运的猜测——根据说明书,它不应该是那样的。然而,这确实可以让面板显示出来——但那时我仍然在拼命地想办法让椭圆形显示出来。
另一个被注释掉的行(add(new View(model));)是尝试使事情正常化的不同方法。在这种情况下,我将那些add函数放在了View类中(见下面的被注释掉的代码)。这实际上可以显示椭圆和面板,但这种方法不能让我更新椭圆形。此外,虽然我只是让椭圆形显示出来,但我似乎无法弄清楚到底是什么让它发生了变化,也似乎无法让它再次出现。
public class View extends JPanel{
private Model model;
public View(Model model) {
this.model = model;
//setLayout(new GridLayout(4,1));
//add(new RadiusPanel(model));
//add(new ColorPanel(model));
//add(new SolidPanel(model));
//add(new TitlePanel(model));
repaint();
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
//center of view panel, in pixels:
int xCenter = getWidth()/2;
int yCenter = getHeight()/2;
int radius = model.getRadius();
int xStart = xCenter - radius;
int yStart = yCenter - radius;
int xWidth = 2 * radius;
int yHeight = 2 * radius;
g.setColor(model.getColor());
g.clearRect(0, 0, getWidth(), getHeight());
if (model.isSolid()){
g.fillOval(xStart, yStart, xWidth, yHeight);
} else {
g.drawOval(xStart, yStart, xWidth, yHeight);
}
}
}
这和之前的想法有点类似 - 被注释掉的代码是我添加的为了尝试让事情运作起来,但不基于提供的指示。在未被注释的情况下,我也取消了mvcFrame行中的add(new View(model));线。
各种面板类(SolidPanel、ColorPanel等)只是扩展了一个名为ControlPanel的类,该类扩展了JPanel。它们似乎都正常工作,没有遇到太多问题。还有一个驱动程序启动GUI。这个也似乎按预期工作。
我遇到的主要问题是无法显示椭圆形,并且我曾经让它显示过一次,但更改它的选项似乎都不起作用。我觉得我已经接近成功了,但此时已经不知道该尝试什么了。
任何能帮忙的人都将获得我的最诚挚感谢。
repaint()
方法。例如,如果在某处更改了椭圆的x位置,但没有任何可见变化 - 这是怎么回事?你调整窗口大小,它就会发生变化。这是因为窗口被重绘了。要通过编程来触发这种行为,请自行调用repaint()
方法。在MVC案例中,当面板显示时,椭圆保持不变,并正常绘制,因此不需要调用repaint
方法。 - Ben