【问题标题】:Using an EventHandler to increase values of an 2D array使用 EventHandler 增加二维数组的值
【发布时间】:2015-12-13 10:14:37
【问题描述】:

我正在尝试使用滑块增加二维数组的值。我本质上想增加由 R G 和 B 数组写入的图像的亮度。我相信我的方法被正确调用并且正在监听滑块值,但我现在担心超过 255 的值。我添加了模数运算符为了防止这种情况发生,但我从开始将金额添加到索引的行开始收到 ArrayOutOfBoundsException。我添加了打印语句以查看值是否发生变化而它们没有变化,但是每当我移动滑块时,就会出现 ArrayOutOfBoundsException。

adjustBrightness 方法来改变数组的值:

     public void adjustBrightness(int amount) {

        int gimmieRows = thePPMImage.getNumRows();
        int gimmieCols = thePPMImage.getNumCols();
        int[][] gimmieRed = thePPMImage.getRedPixels();
        int[][] gimmieBlue = thePPMImage.getBluePixels();
        int[][] gimmieGreen = thePPMImage.getGreenPixels();
        int[][] brighterRedPixels =new int[gimmieRed.length][gimmieRed[0].length];
        int [][] brighterGreenPixels = new int[gimmieGreen.length][gimmieGreen.length];
        int [][] brighterBluePixels = new int[gimmieBlue.length][gimmieBlue[0].length];


        for (int i = 0; i < gimmieRows; i++) {
            for (int j = 0; j < gimmieCols; j++) {
                  if ((i+amount)%255>1.0 || (j+amount)%255>1.0) {
                      amount =amount-255;}
                  else  ((i+amount)%255<=1.0 || (j+amount)%255<=1.0)
                        {amount=amount;}
                System.out.println(gimmieRed[11][7]);

                brighterRedPixels[i][j] = amount + gimmieRed[i][j];
                brighterGreenPixels[i][j] = amount + gimmieGreen[i][j];
                brighterBluePixels[i][j] = amount + gimmieBlue[i][j];

                System.out.println(gimmieRed[11][7]);
                System.out.println(brighterRedPixels[11][7]);


            }

        } 
        thePPMImage = new PPMImage(brighterRedPixels, brighterGreenPixels,brighterBluePixels );
                thePPMImage.setRedPixels(brighterRedPixels);
                thePPMImage.setGreenPixels(brighterGreenPixels);
                thePPMImage.setBluePixels(brighterBluePixels);
                imageLabel.setIcon(new SImage(
                        transposeArray(thePPMImage.getRedPixels()),
                        transposeArray(thePPMImage.getGreenPixels()),
                        transposeArray(thePPMImage.getBluePixels())));

更改滑块的侦听器。

public class event implements ChangeListener {
     public void stateChanged (ChangeEvent e){

        int amount = brightnessSlider.getValue();
        adjustBrightness(amount);

任何见解都将不胜感激,这项任务就像昨天一样到期。

【问题讨论】:

  • 存在“else if”语句是因为我有一些其他 JMenu 项目的编码,高于adjustBrightnessJmenuItem 的项目
  • "但是当我尝试调用它时,我得到一个关于取消引用的 int 的错误。" 1) 总是复制/粘贴错误和异常输出! 2) 为了尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 3) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。 4) 当一个动作发生时重复创建 GUI 组件似乎是个坏主意。将它们声明为类属性,如果为 null,则创建它们。否则,只需使用所需的任何值显示当前实例。
  • @Andrew 好的。感谢您提供有用的提示。我能够调用我的方法。我现在指的异常是 ArrayOutOfBoundsException。我相信这是因为一旦我移动滑块,我的索引值就会超过 255。我在 if 语句中包含了模运算符,但我仍然在第 1 格。
  • 仍然没有 MCVE 并且您的未复制/粘贴错误输出。也许其他人可以帮助你,但我不会花更多时间帮助一个无视我建议的人。

标签: java arrays image swing event-handling


【解决方案1】:

我目前看到ArrayOutOfBoundsException 的唯一原因是gimmieRed[11][7]brighterRedPixels[11][7] 的println。如果其中一个数组没有 12 行或 8 列,则会引发异常。

如果您添加了PPMImageSImage 类和transposeArray 方法的(简化)版本,将会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2023-01-30
    • 2020-05-01
    • 2017-06-06
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多