【问题标题】:How to convert a Swing program into MVC form? [closed]如何将 Swing 程序转换为 MVC 形式? [关闭]
【发布时间】:2023-03-15 04:45:02
【问题描述】:

我从下面给出的链接获得了制作条形图的源代码 -

Bar chart in java

我创建了一个模型类来存储项目及其对应的值。然后,我制作了一个面板类,它应该只接受模型并将其显示为条形图。然后我创建了一个框架类,将面板添加到它的内容窗格中。然后,我创建了一个应该运行所有这些的驱动程序类,就像链接中给出的代码一样。

问题是我只看到我的框架而没有看到条形图。我该如何解决?

我故意不包含我的代码,因为它太大了。但是,如果你觉得我应该把它放在这里,那么请告诉我。

package myArea;

public class SimpleBarChartModel{

private String[] items;
private double[] valuesOfItems;
private String title;

public SimpleBarChartModel(String[] itemList, double[] valueList, String title){

    String[] items = itemList;
    double[] valuesOfItems = valueList;

}

public String[] getItems(){
    return items;
}

public void setItems(String[] items){
    this.items = items;
}

public double[] getValuesOfItems(){
    return valuesOfItems;
}

public void setValuesOfItems(double[] valuesOfItems){
    this.valuesOfItems = valuesOfItems;
}

public String getTitle(){
    return title;
}

public void setTitle(String title){
    this.title = title;
}


}


package myArea;

import java.awt.*;
import javax.swing.*;

public class SimpleBarChartPanel extends JPanel{

SimpleBarChartModel bChartMdl; 

public SimpleBarChartPanel(SimpleBarChartModel bcMdl){

    bChartMdl = bcMdl; 

}

public void paintComponent(Graphics graphics) {

//Must always be the first line in paintComponent method
super.paintComponent(graphics);
double[] values = bChartMdl.getValuesOfItems();
String[] items = bChartMdl.getItems();
String title = bChartMdl.getTitle();     

if (values == null || values.length == 0)
return;

double minValue = 0;
double maxValue = 0;

for (int i = 0; i < values.length; i++) {
    if (minValue > values[i]){

        minValue = values[i];
    }

    if (maxValue < values[i]){

        maxValue = values[i];
    }

}

Dimension dim = getSize();
int clientWidth = dim.width;
int clientHeight = dim.height;
int barWidth = clientWidth / values.length;
Font titleFont = new Font("Book Antiqua", Font.BOLD, 15);
FontMetrics titleFontMetrics = graphics.getFontMetrics(titleFont);
Font labelFont = new Font("Book Antiqua", Font.PLAIN, 10);
FontMetrics labelFontMetrics = graphics.getFontMetrics(labelFont);
int titleWidth = titleFontMetrics.stringWidth(title);
int q = titleFontMetrics.getAscent();
int p = (clientWidth - titleWidth) / 2;
graphics.setFont(titleFont);
graphics.drawString(title, p, q);
int top = titleFontMetrics.getHeight();
int bottom = labelFontMetrics.getHeight();

if (maxValue == minValue){
    return;
}


double scale = (clientHeight - top - bottom) / (maxValue - minValue);
q = clientHeight - labelFontMetrics.getDescent();
graphics.setFont(labelFont);

for (int j = 0; j < values.length; j++) {
    int valueP = j * barWidth + 1;
    int valueQ = top;
    int height = (int) (values[j] * scale);

    if (values[j] >= 0){

        valueQ += (int) ((maxValue - values[j]) * scale);
}else{
        valueQ += (int) (maxValue * scale);
        height = -height;
}

        graphics.setColor(Color.blue);
        graphics.fillRect(valueP, valueQ, barWidth - 2, height);
        graphics.setColor(Color.black);
        graphics.drawRect(valueP, valueQ, barWidth - 2, height);
        int labelWidth = labelFontMetrics.stringWidth(items[j]);
        p = j * barWidth + (barWidth - labelWidth) / 2;
        graphics.drawString(items[j], p, q);

    }

}   


}


package myArea;

import javax.swing.*;

public class SimpleBarChartView extends JFrame{

SimpleBarChartPanel bChartPanel;

public SimpleBarChartView(SimpleBarChartPanel bcPanel, int width, int height){

    bChartPanel = bcPanel;
    this.setSize(width, height);
    this.getContentPane().add(bChartPanel);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}   


package myArea;

public class SimpleBarChartDriver {

public static void main(String[]args){

    double[] value= new double[5];
    String[] languages = new String[5];

    value[0] = 1;
    languages[0] = "Visual Basic";

    value[1] = 2;
    languages[1] = "PHP";

    value[2] = 3;
    languages[2] = "C++";

    value[3] = 4;
    languages[3] = "C";

    value[4] = 5;
    languages[4] = "Java";

            SimpleBarChartModel sBModel = 
            new SimpleBarChartModel(languages,value,"comp languages");
    SimpleBarChartPanel sBPanel = new SimpleBarChartPanel(sBModel);
    SimpleBarChartView sbView = new SimpleBarChartView(sBPanel, 500, 500);
    sbView.setVisible(true);    
}

}

更新 - 这些是我在运行驱动程序类时遇到的错误

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sun.font.FontDesignMetrics.stringWidth(Unknown Source)

【问题讨论】:

  • 你无法控制别人的投票。
  • “然后,我制作了一个面板类,它应该只接受模型并将其显示为条形图。” 好的。虽然为什么要扩展面板而不是只使用一个实例? “我从下面给出的链接中获得了制作条形图的源代码 - roseindia.noooo..... 请告诉我。不要投反对票。” 如果有人要投反对票,更有可能是要求修复或查看源自 RoseIndia 的代码(或敢于指挥他们的行动)。
  • 我担心您目前发布的帖子无法回答,因为您没有提供足够的信息让我们了解问题。您向我们询问行为不端的代码,但我们没有看到任何代码。你最好的办法是先隔离你的问题,然后在没有解决它的情况下,提出有问题的代码。否则这个问题可能会被关闭。
  • @HovercraftFullOfEels - 请点赞
  • @SuperStar - 绝对不是。 “你不能控制别人的选票”的哪一部分你不明白?

标签: java swing model-view-controller


【解决方案1】:

您正在隐藏类中的变量:

class SimpleBarChartModel {
   private String[] items;
   private double[] valuesOfItems;
   private String title;

   public SimpleBarChartModel(String[] itemList, double[] valueList,
         String title) {
      String[] items = itemList; // **** here
      double[] valuesOfItems = valueList;  // **** here
   }

如上所示,您正在重新声明类字段,因此实际字段将保持为空值。解决方法不是重新声明字段而是使用类字段:

class SimpleBarChartModel {
   private String[] items;
   private double[] valuesOfItems;
   private String title;

   public SimpleBarChartModel(String[] itemList, double[] valueList,
         String title) {
      items = itemList; // **** here
      valuesOfItems = valueList;  // **** here

      // !! missing something else here !! ;-)
   }

接下来,当您收到 NullPointerException 时,请检查引发异常的行。其中一个变量尚未初始化,您必须更正代码以使其初始化。

【讨论】:

  • 哦,我太傻了 :( 我修复了那个错误。但是,现在我得到一个空指针异常。我现在在我的问题中提到了它。请帮我修复它。
  • @SuperStar:你真傻,我已经在回答中提到了 NPE,并在我的第二个代码块中暗示了它的解决方案。
  • DUHHHHH.... :( 为什么我会犯这么愚蠢的错误 :( 谢谢气垫船...也许我需要把头放在装满鳗鱼的桶里 :P
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多