java - 尝试在图表中标记条形,但多次生成文本

标签 java swing bar-chart

我正在创建一个程序,请求用户一个月的销售额,并将销售额执行为条形图。程序运行并正确生成条形图;但是文本没有正确执行。我尝试将标题“每月销售额”作为图表标题,用销售助理名称标记条形,并在图表左侧标记条形的值。任何建议都会有帮助。它在整个图表中重复生成“每月销售额”。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BarGraph extends JPanel
{
 //set variables for graph
     JLabel jLabel1, jLabel2, jLabel3, jLabel4, jLabel5;

    private Map<Color, Integer> bars =
           new LinkedHashMap <>();


    //execute bars and color
    public void addBar(Color color, int value)

   {
      bars.put(color, value);
      repaint();

   }

        //create paint components of chaart
   public void paintComponent(Graphics g)

   {


       Dimension d = getSize();
    int clientWidth = d.width;
    int clientHeight = d.height;
    int max = Integer.MIN_VALUE;
      for (Integer value : bars.values())
      {
         max = Math.max(max, value);
      }
           jLabel1 = new JLabel("Sales For Month", JLabel.CENTER);
        // We can position of the text, relative to the icon:
        jLabel1.setVerticalTextPosition(JLabel.BOTTOM);

        jLabel2 = new JLabel("PAM");
                jLabel3 = new JLabel("Leo");
                jLabel4 = new JLabel("Kim");
        jLabel5 = new JLabel("BOB"); // Label of Icon Only
        // Add labels to the Panel
        add(jLabel1);




      //paint bar
      int width = (getWidth() / bars.size()) - 2;
      int x = 1;
      for (Color color : bars.keySet())
      {
         int value = bars.get(color);
         int height = (int)
                 ((getHeight() -5) * ((double)value /max));
         g.setColor(color);
         g.fillRect(x, getHeight() - height, width, height);
         g.setColor(Color.black);
         g.drawRect(x, getHeight() - height, width, height);
         x += (width + 2);       
      }




   }
   //set bar size
   public Dimension getPreferredSize()
   {
      return new Dimension(bars.size() * 10 + 2, 50);
   }

  //create main to generate charte
  public static void main(String[] args) 
  {
      JFrame frame = new JFrame("Friendly Hal's Auto");
      BarGraph graph = new BarGraph();
      //set frame size
      frame.setSize(350, 300);
      //create variable for user input
      int carsSold1;
      int carsSold2;
      int carsSold3;
      int carsSold4;  

      //request user input

      Scanner input = new Scanner(System.in);
      System.out.println("How many cars did Pam sell for the month?");
      carsSold1 = input.nextInt();        
      System.out.println("How many cars did Leo sell for the month?");
      carsSold2 = input.nextInt();
      System.out.println("How many cars did Kim sell for the month?");
      carsSold3 = input.nextInt();
      System.out.println("How many cars did Bob sell for the month?");
      carsSold4 = input.nextInt();

      //color bar to user choice
     graph.addBar (Color.red, carsSold1);
     graph.addBar (Color.green, carsSold2);
     graph.addBar(Color.blue, carsSold3);
     graph.addBar(Color.yellow, carsSold4);
     frame.getContentPane().add(graph);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.pack();
     frame.setVisible(true);


  }

最佳答案

你的问题是,你破坏了油漆链......

public void paintComponent(Graphics g)
{
    // Your problem is right here...

    Dimension d = getSize();

paintComponent 的工作之一是清除 Graphics 上下文(带有组件背景色),为绘画做好准备...

在进行任何自定义绘制之前,添加 super.paintComponent(g); 作为对 paintComponent 方法的第一次调用

Graphics 上下文是共享资源,在给定绘制周期内绘制的所有组件都将共享相同的 Graphics 上下文,并且在某些系统上,它对于所有绘画周期,因此您需要确保在使用之前将其清除...

参见Painting in AWT and SwingPerforming Custom Painting了解更多详情。

已更新

正如 @HovercraftFullOfEels 所指出的,您正在 paintComponent 中创建 UI 元素,绘画应该绘制 UI 的当前状态,并且不应对其进行任何修改。当重绘管理器认为应该完成时,绘画就会完成,因此您的 paintComponent 可能会被调用多次,具体取决于您在做什么。

paintComponent内部修改UI的状态可以设置重绘请求的无限循环,这最终将消耗您的CPU周期并使您的PC无法使用...

可能还想读一下Initial Threads并确保您的 UI 仅在事件调度线程的上下文中创建和修改。

您也不应该混合基于 UI 和控制台的方法,它们不能很好地混合在一起......

关于java - 尝试在图表中标记条形,但多次生成文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27053353/

相关文章:

Java setBounds() 方法 (JFrame)

java - 为什么 JFrame 中的绘图颜色没有更新?

javascript - 将股票代码添加到 Flot 条形图中

postgresql - matplotlib 条形图 : How to spread bars evenly in a postgres-generate_series?

Java 8/Lambda : multiple collect/Collectors. groupingBy 带排序

java - 如何访问 arrayList 的 String 成员以连接到它们?

Java:如何循环遍历数组并检查它是否与变量值匹配?

java - 在 Netbeans 中从 JFrame 到 JPanel

java - 高效地将大量数据加载到 Jtable

java - 是否可以使用 Achartengine 绘制多个堆叠条形图?