Java 在JPanel上绘制条形图并将其添加到JScrollPane上在Mac OS上工作,但在Windows OS上不工作?

Java 在JPanel上绘制条形图并将其添加到JScrollPane上在Mac OS上工作,但在Windows OS上不工作?,java,swing,graphics,Java,Swing,Graphics,我的代码的一个特点是,它显示一个频率条形图,其中包含给定的数据。在我的MacBook上,它工作得非常好,但是当我尝试在我的剃须刀刀片上使用它时,它并没有像预期的那样工作。我已经提供了截图,这样你可以看到发生了什么,如果你能给我一些关于这方面的见解 Windows操作系统: Mac操作系统: 导入javax.swing.*; 导入java.awt.*; 导入java.util.HashMap; 导入java.util.Map; 公共班机{ 公共静态void main(字符串[]args){

我的代码的一个特点是,它显示一个频率条形图,其中包含给定的数据。在我的MacBook上,它工作得非常好,但是当我尝试在我的剃须刀刀片上使用它时,它并没有像预期的那样工作。我已经提供了截图,这样你可以看到发生了什么,如果你能给我一些关于这方面的见解

Windows操作系统:

Mac操作系统:


导入javax.swing.*;
导入java.awt.*;
导入java.util.HashMap;
导入java.util.Map;
公共班机{
公共静态void main(字符串[]args){
调用器(BarChartGUI::new);
}
}
类BarChartGUI扩展了JFrame{
公共BarChartGUI(){
Map frequencyTableData=getFrequencyTableData();
条形图条形图=新条形图(frequencyTableData);
JScrollPane chartScrollPane=新的JScrollPane(条形图);
chartScrollPane.setPreferredSize(新维度(1000500));
添加(图表滚动窗格);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
包装();
setLocationRelativeTo(空);
setVisible(真);
}
私有映射getFrequencyTableData(){
Map frequencyTableData=new HashMap();
对于(int i=0;i<2000;i++){
frequencyTableData.put(字符串.valueOf(i),i);
}
返回频率表数据;
}
}
类条形图扩展了JPanel{
//绘制图表信息的空间
公共静态最终int TOP_缓冲区=30;
公共静态最终int轴_偏移=20;
//Hashmap数据类型保存列值中字符串的频率
私人最终地图数据;
//存储维度值
私有宽度;
私家车高度;
私人海图;
公共条形图(地图频率表数据){
超级();
数据=频率表数据;
挫折地面(颜色:白色);
}
公共组件(图形g){
图形2d g2=(图形2d)g;
computeSize();
牵引杆(g2);
}
//检索面板的大小
私有void computeSize(){
//获取图表的区域大小
chartWidth=this.getWidth()-2*轴偏移量;
chartHeight=this.getHeight()-2*轴偏移-顶部缓冲区;
//这是原点的坐标图
chartY=此.getHeight()-轴偏移;
}
//根据数据中存储的值及其频率绘制条形图
公共空隙牵引杆(图2D g2){
int numberOfBars=data.size();
双最大高度=0;
//查找最高条的高度
对于(整数频率:data.values()){
中频(最大高度<频率)
最大高度=频率;
}
//计算钢筋的宽度
int barWidth=图表宽度/条数;
如果((图表宽度/条数)<5){
杆宽=5;
}
int值;
内部高度;
int-xLeftCord;
int-yTopLeftCord;
int计数器=0;
g2.设置颜色(颜色为黑色);
//为hashmap中的每个键绘制条
for(字符串栏:data.keySet()){
值=data.get(bar);
双条码高度十进制=(值/最大高度)*图表高度;
barHeight=(int)barHeightDecimal;
xLeftCord=轴偏移+计数器*条形宽度;
yTopLeftCord=图表-酒吧高度;
矩形rec=新矩形(xLeftCord、yTopletCord、条宽、条高);
g2.绘制(rec);
计数器++;
}
}
}
这是:

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

    computeSize();
    drawBars(g2);
}
缺少对super方法的调用:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;

    computeSize();
    drawBars(g2);
}
如果没有这一点,JPanel就无法进行内务处理绘制或清除脏像素

这是:

缺少对super方法的调用:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;

    computeSize();
    drawBars(g2);
}

如果没有这一点,JPanel就无法进行内务处理、绘制或清除脏像素

请考虑将您的代码和问题压缩到为我们编译和运行的最小程序中,这将为我们演示您的问题,但除此之外,它什么也做不了,这是一个非常好的解决方案。该链接将准确解释这是什么,以及创建和发布此链接如何帮助您和我们。此外,请提供指向图像本身的链接,而不是指向保存图像的网页的链接it@HovercraftFullOfEels当然,我会的。我认为这更多的是我的系统或设置的问题,而不是代码的问题。我将尝试重现错误。这些链接是Gyazo GIF视频,如果可以,我会尝试链接。@hoverCraftfullOfels我已经用我的原始代码创建了一个MRE来显示我面临的问题。如果你能看一下,我会非常高兴的!非常感谢。我发现了一个关键的突出的Swing图形错误,考虑将您的代码和问题压缩到为我们编译和运行的最小程序中,这向我们展示了您的问题,但除此之外什么也不做,一个简单的例子。该链接将准确解释这是什么,以及创建和发布此链接如何帮助您和我们。此外,请提供指向图像本身的链接,而不是指向保存图像的网页的链接it@HovercraftFullOfEels当然,我会的。我认为这更多的是我的系统或设置的问题,而不是代码的问题。我将尝试重现错误。这些链接是Gyazo GIF视频,如果可以,我会尝试链接。@hoverCraftfullOfels我已经用我的原始代码创建了一个MRE来显示我面临的问题。如果你能看一下,我会非常高兴的!非常感谢。我发现了一个关键的炫目摆动图形错误这么小的错误哈哈,但这是固定的!我能问一下为什么它在Mac操作系统而不是Windows操作系统上工作吗?@Ryan:它们有非常不同的操作系统特定的图形内部结构,所以虽然Java代码是相同的,但是本地代码是不同的。这是可以理解的,非常感谢!这么小的错误,哈哈,但这已经解决了!我能问一下为什么它能在Mac OS而不是Windows OS上工作吗?@Ryan:它们有非常不同的操作系统特定的图形内部结构,因此虽然Java代码是相同的,但本机代码是di