当前位置: 首页 > 知识库问答 >
问题:

在JPanel上绘制条形图并将其添加到JScrollPane上可以在Mac操作系统上工作,但在Windows操作系统上不行?[副本]

勾通
2023-03-14

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

Windows操作系统:https://gyazo.com/5107EED39D548687AD772A60E065055B

Mac操作系统:https://gyazo.com/6d32df9e08b9ce0c089dbe1b4d35af64


import javax.swing.*;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args){
        SwingUtilities.invokeLater(BarChartGUI::new);
    }

}

class BarChartGUI extends JFrame{

    public BarChartGUI(){

        Map<String, Integer> frequencyTableData = getFrequencyTableData();
        BarChart barChart = new BarChart(frequencyTableData);
        JScrollPane chartScrollPane = new JScrollPane(barChart);
        chartScrollPane.setPreferredSize(new Dimension(1000, 500));
        add(chartScrollPane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private Map<String, Integer> getFrequencyTableData(){
        Map<String, Integer> frequencyTableData = new HashMap<>();
        for (int i = 0; i < 2000; i++){
            frequencyTableData.put(String.valueOf(i), i);
        }
        return frequencyTableData;
    }
}

class BarChart extends JPanel {

    // Space to draw Chart Information
    public static final int TOP_BUFFER = 30;
    public static final int AXIS_OFFSET = 20;

    // Hashmap datatype holds the frequency of the String within the columnValues
    private final Map<String, Integer> data;

    // Stores dimension values
    private int chartWidth;
    private int chartHeight;
    private int chartY;

    public BarChart(Map<String, Integer> frequencyTableData){
        super();
        data = frequencyTableData;

        setBackground(Color.white);

        // Makes the Panel larger if the bar chart is not able to be fully displayed
        if ((chartWidth / frequencyTableData.size() < 5)) {
            setPreferredSize(new Dimension(5*frequencyTableData.size() + 50, getHeight()));
        }

    }

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

        computeSize();
        drawBars(g2);
    }

    // Retrieves the size of panel
    private void computeSize() {
        // Gets the chart's area size
        chartWidth = this.getWidth() - 2*AXIS_OFFSET;
        chartHeight = this.getHeight() - 2*AXIS_OFFSET - TOP_BUFFER;

        // Get's the chart's coords for the origin
        chartY = this.getHeight() - AXIS_OFFSET;
    }

    // Draws the Bar Chart depending on the values and its frequency stored within data
    public void drawBars(Graphics2D g2) {
        int numberOfBars = data.size();
        double maxHeight = 0;

        // Finds the height of the highest bar
        for (Integer freq : data.values()) {
            if (maxHeight < freq)
                maxHeight = freq;
        }

        // Calculates width of bar
        int barWidth = chartWidth / numberOfBars;
        if ((chartWidth / numberOfBars) < 5){
            barWidth = 5;
        }

        int value;
        int barHeight;
        int xLeftCord;
        int yTopLeftCord;
        int counter = 0;
        g2.setColor(Color.black);

        // Draws the bar for every key in the hashmap
        for (String bar : data.keySet()) {
            value = data.get(bar);

            double barHeightDecimal = (value/maxHeight)* chartHeight;
            barHeight = (int) barHeightDecimal;

            xLeftCord = AXIS_OFFSET + counter * barWidth;
            yTopLeftCord = chartY - barHeight;
            Rectangle rec = new Rectangle(xLeftCord, yTopLeftCord, barWidth, barHeight);

            g2.draw(rec);

            counter++;
        }
    }



}

共有1个答案

田曜瑞
2023-03-14

这个:

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就无法进行内务绘画或清除脏像素

 类似资料:
  • 问题内容: Oracle的可用下载列表上似乎没有32位下载程序包。 更新 可以在这里下载: 问题答案: 尽管Oracle的糟糕,未加密的 下载页面 似乎缺少JDK9的32位二进制文​​件,但是,如果(单击“接受许可协议”后)复制64位二进制文​​件的URL并更改 为 ,它将为您提供32 位二进制文​​件位二进制文​​件。 更新:现在不见了。怪异的!Oracle在玩什么?他们致力于修复Java 9的

  • 问题内容: 是否可以在任何操作系统(例如Windows,Linux,Mac OS X)上执行JAR文件?我想构建一个要在Linux,Windows和Mac OS X上运行的简单应用程序。JAR文件可以在安装了Java的任何操作系统上运行吗? 问题答案: Jar文件可在存在JVM的任何OS上运行。

  • 本文向大家介绍Ruby环境设置| 在Mac和Windows操作系统上安装Ruby,包括了Ruby环境设置| 在Mac和Windows操作系统上安装Ruby的使用技巧和注意事项,需要的朋友参考一下 Ruby环境设置 1)在Mac操作系统上安装Ruby Ruby已包含在默认的macOS安装中,但它不是最新版本。在以下步骤中,我们将使用Homebrew设置Ruby编程环境。您将必须使用终端应用程序提供的

  • 问题内容: 我已经下载并安装了IDEA 13.1。但是,即使具有64位系统,Windows也会自动将程序安装在专用于32位程序的文件夹中。 是否有适用于64位版本的其他下载文件,或者可能有特殊设置以使其适合64位系统? 问题答案: 在中,有一个名为的可执行文件。这适用于64位系统。您只需将IntelliJ快捷方式路径更改为该路径即可。 您还需要添加一个指向您的64位JDK 的新环境变量,以便Int

  • 我试图制作一个跨平台的JavaFX应用程序,它在Windows和OSX机器上工作得很好,但在Linux上不行。 jar是在Intellij思想中使用基本的JavaFX配置构建的。 有人帮忙吗?

  • 操作系统:Windows 7终极版 处理器:AMD FX 8120 8核2.81 GHz 提前感谢!