gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:15:20 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com