Java JComponent不会显示图像

Java JComponent不会显示图像,java,swing,graphics2d,jcomponent,paintcomponent,Java,Swing,Graphics2d,Jcomponent,Paintcomponent,我是一个初学者程序员,我正在努力让这个程序运行。尽管JComponent的新Java屏幕上没有显示任何图像,但所有内容都可以正确编译。这个程序要做的就是获取一个输入值,并将其分配给条形图的大小值。在程序中,我必须使用一个exterior paintcomponent类来运行原始类以及一个驱动程序,这可能正是让我感到厌烦的地方。提前谢谢 public class BarChartTester { public static void main(String[] args) { B

我是一个初学者程序员,我正在努力让这个程序运行。尽管JComponent的新Java屏幕上没有显示任何图像,但所有内容都可以正确编译。这个程序要做的就是获取一个输入值,并将其分配给条形图的大小值。在程序中,我必须使用一个exterior paintcomponent类来运行原始类以及一个驱动程序,这可能正是让我感到厌烦的地方。提前谢谢

public class BarChartTester
{
public static void main(String[] args)
  {

      BarChartPaintComponent component = new BarChartPaintComponent();
      Scanner in = new Scanner(System.in);
      System.out.println("Enter the Values you wish to use (>0). Press -1 on an empty line to stop");
      Boolean flag = false;
      while(!flag)
      {
           double numbers = in.nextDouble();
           if(numbers == -1)
           flag = true;
           else if(numbers<-1)
           System.out.println("You have typed in invalid number");
           else
           component.add(numbers);
     }
      JFrame frame = new JFrame();
      frame.setSize(300, 300);
      frame.setTitle("A Bar Graph");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(component);
      frame.setVisible(true);
    }

}

public class BarChart extends JComponent
{
private ArrayList<Double> list;
private double value;
private int i;

public BarChart()
{

    list = new ArrayList<Double>();
}


public void add(double value)
{
    list.add(i, value);
    i++;
}

public void draw(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;

    Double greatest = list.get(0);
    Double least;
    for(int j =1;j<=list.size();j++)
    {
        if(list.get(j)> greatest)
        greatest = list.get(j);
        else
        least = list.get(j);


    }

    for(int i = 0;i<=list.size();i++)
    {
        int x = 20;
        int width = 20;
        double barNumber = list.get(i);
        double size = barNumber;
        if(list.get(i) == greatest){
        g2.setPaint(Color.BLUE);
        g2.fill(new Rectangle2D.Double(x,300,width,300));
        }
        else
        {
            g2.setPaint(Color.BLUE);
             g2.fill(new Rectangle2D.Double(x,300,width, barNumber));
         }

        x +=20;

    }



}










}


public class BarChartPaintComponent extends BarChart
{
public void paintComponent(Graphics g, double array){
    Graphics2D g2 = (Graphics2D) g;
    BarChart component= new BarChart();
    component.add(array);
    component.draw(g2);

}
}
公共类BarChartTester
{
公共静态void main(字符串[]args)
{
BarChartPaintComponent=新的BarChartPaintComponent();
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入您希望使用的值(>0)。在空行上按-1停止”);
布尔标志=假;
while(!flag)
{
双倍数字=in.nextDouble();
如果(数字==-1)
flag=true;

else if(numbers您的主要问题是,由于您没有实现paintComponent(Graphics g)方法,因此将永远不会调用打算绘制的代码。因此,请更换paintComponent:

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    this.draw(g2);
}
然后根据史蒂文斯的建议进行修正


另外,在第二个for中,您正在初始化变量x(int x=20)。这样,x在循环的每次迭代中都是20。在for循环之前执行此操作。

欢迎编程!您有两个循环在列表中运行,其中的“for”语句如下:for(int j=1;jthanks)很多,但这并不能完全回答我的问题:(我认为Alexandre是对的,尽管我怀疑你的程序可能抛出了一个你没有看到的异常,因为我也发现了一些问题。Alexandre的解决方案的另一个选择可能是简单地将“draw”方法的名称改为“paintComponent,”因为这将覆盖BarChart扩展的JComponent对象的paintComponent方法,而您的“draw”方法已经将图形参数(g)转换为Graphics2D对象。我对Alexandre的答案投了赞成票,因为我认为他发现了您的问题,但也因为他批准了我的建议8-)1.有机会时请回答。