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

GLFW窗口图标

司马宏茂
2023-03-14
try {
            BufferedImage originalImage =
                    ImageIO.read(new File("favicon.png"));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( originalImage, "png", baos );
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            ByteBuffer buF = ByteBuffer.wrap(imageInByte);
            GLFWImage.Buffer b = new GLFWImage.Buffer(buF);
            glfwSetWindowIcon(window, b);
        } catch (IOException io){
            System.out.println("Could not load window icon!");
            System.out.println(io.toString());
        }
# A fatal error has been detected by the Java Runtime Environment:
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

提前谢了。

共有1个答案

阴永福
2023-03-14

这种解决方案是笨拙的;但是,它对我有效!:)它基于lwjgl事件演示中的代码,但要使用它,我必须实现演示Ioutil。设置图标的代码如下:

ByteBuffer icon16;
ByteBuffer icon32;
try {
    icon16 = IOUtil.ioResourceToByteBuffer("src/hexsweeper/hex16.png", 2048);
    icon32 = IOUtil.ioResourceToByteBuffer("src/hexsweeper/hex32.png", 4096);
} catch (Exception e) {
    throw new RuntimeException(e);
}

    
IntBuffer w = memAllocInt(1);
IntBuffer h = memAllocInt(1);
IntBuffer comp = memAllocInt(1);
    
try ( GLFWImage.Buffer icons = GLFWImage.malloc(2) ) {
    ByteBuffer pixels16 = stbi_load_from_memory(icon16, w, h, comp, 4);
    icons
        .position(0)
        .width(w.get(0))
        .height(h.get(0))
        .pixels(pixels16);

    ByteBuffer pixels32 = stbi_load_from_memory(icon32, w, h, comp, 4);
    icons
        .position(1)
        .width(w.get(0))
        .height(h.get(0))
        .pixels(pixels32);

    icons.position(0);
    glfwSetWindowIcon(window, icons);

    stbi_image_free(pixels32);
    stbi_image_free(pixels16);
}

进口情况如下:

import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import org.lwjgl.glfw.GLFWImage;

import static org.lwjgl.stb.STBImage.*;
import static org.lwjgl.system.MemoryUtil.*;

在另一个文件(名为IOUtil)中,我放置了以下代码:

import org.lwjgl.BufferUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static org.lwjgl.BufferUtils.*;

public final class IOUtil {

private IOUtil() {
}

private static ByteBuffer resizeBuffer(ByteBuffer buffer, int newCapacity) {
    ByteBuffer newBuffer = BufferUtils.createByteBuffer(newCapacity);
    buffer.flip();
    newBuffer.put(buffer);
    return newBuffer;
}

/**
 * Reads the specified resource and returns the raw data as a ByteBuffer.
 *
 * @param resource   the resource to read
 * @param bufferSize the initial buffer size
 *
 * @return the resource data
 *
 * @throws IOException if an IO error occurs
 */
public static ByteBuffer ioResourceToByteBuffer(String resource, int bufferSize) throws IOException {
    ByteBuffer buffer;

    Path path = Paths.get(resource);
    if ( Files.isReadable(path) ) {
        try (SeekableByteChannel fc = Files.newByteChannel(path)) {
            buffer = BufferUtils.createByteBuffer((int)fc.size() + 1);
            while ( fc.read(buffer) != -1 ) ;
        }
    } else {
        try (
            InputStream source = IOUtil.class.getClassLoader().getResourceAsStream(resource);
            ReadableByteChannel rbc = Channels.newChannel(source)
        ) {
            buffer = createByteBuffer(bufferSize);

            while ( true ) {
                int bytes = rbc.read(buffer);
                if ( bytes == -1 )
                    break;
                if ( buffer.remaining() == 0 )
                    buffer = resizeBuffer(buffer, buffer.capacity() * 2);
            }
        }
    }

    buffer.flip();
    return buffer;
}

}
 类似资料:
  • 我对glfw有一个小问题。 我的代码非常简单,我只想创建一个空窗口。 } 此代码编译,但当我运行它时,我只有一个白色窗口。窗口的标题是正确的,但里面的一切都是白色的......我尝试像那样使用glClearColor。 但是我的窗户仍然是白色的....我用的是visual studio 2015。 怎么弄个黑窗? 编辑: 忘了补充这个:glfwMakeContextCurrent(window);

  • 我不熟悉使用LWJGL(一般来说Java也是如此),因此,我阅读了他们关于入门的页面,他们提供了一个Hello World程序示例。我自己尝试运行它,发现它出现以下错误:<代码>2020-03-18 10:20:02.145 java[19779:1119716]***由于未捕获的异常“nSinternalinconsistenceexception”而终止应用程序,原因:“[NSUndoMana

  • 我有一些问题与GLFW的窗口创建。我希望有一个程序能够在窗口和全屏模式之间切换。要在GLFW 2.7.8中做到这一点,必须首先销毁活动窗口,然后创建一个新的窗口。我读到3.0版本支持多个窗口,但它仍在开发中。 我提供了自己的功能来处理键盘输入。使用最初的400×400窗口,程序按预期运行;它将在f或F上进入全屏,当按下转义键时退出,当按下任何其他键时都会抱怨。 但是,当进入全屏模式时,窗口对我提供

  • 我有以下代码: 它在我的Ubuntu和视窗桌面上都能正常工作,但在我运行OSX的笔记本电脑上却失败了。我认为笔记本电脑不支持这个版本的OpenGL是个问题,但它支持高达4.1的显卡。 我认为它可能使用集成的intel GPU而不是英伟达GPU,但据我所知,GLFW将强制使用正确的GPU进行渲染。 如果我将上下文更改为2.1,一切似乎都正常,但着色器不兼容。 有什么想法吗? 更新:如果删除了所有调用