gpt4 book ai didi

java - JFrame 未全屏显示所有图像

转载 作者:行者123 更新时间:2023-12-02 03:09:45 25 4
gpt4 key购买 nike

所以,我正在开发一个需要在图像之间切换的项目。图像需要处于全屏模式。我似乎面临两个问题。首先是图像切换。当我在图像之间切换时,某些图像在切换时显示正常。其他人似乎根本没有出现在屏幕上。我似乎得到了一个空框架。其次,正确的键似乎每次都有效,但为了我的理智,我已经放了系统打印。系统输出似乎没有显示在控制台上,但它会切换帧中的图像(尽管有时我会得到一个空帧)。任何建议/解决方案将不胜感激。

关于代码的注意事项:我拥有的绘制字符串用于测试坐标的目的。我正在使用 Eyetribe,所以只是为了显示我正在看的地方。拉绳似乎工作得很好。另外,我调用 switchImage 的速度非常快,几乎一秒钟 22 次。这会是一个问题吗?尽管这让我想知道为什么它适用于某些图像而不适用于其他图像。更新:问题似乎出在 g.drawImage 中。它似乎没有为某些图像绘制,但我似乎无法弄清楚为什么会发生这种情况。目前这是我的全屏图像代码。

public void showFrame(){

//jL -> JLabel
//jF -> JFrame
//jP -> Panel
jF.setTitle("Test");
jF.setUndecorated(true);
jF.setResizable(false);
jF.setVisible(true);

Toolkit tk = Toolkit.getDefaultToolkit();
int xsize = (int)tk.getScreenSize().getWidth();
int ysize = (int)tk.getScreenSize().getHeight();
jF.setSize(xsize, ysize);
jF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



if(testImagesList != null){
img = new ImageIcon(testImagesList.get(0));
}
Image imag = img.getImage();
bi = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.drawImage(imag, 0, 0, 1280, 800, null);

ImageIcon newIcon = new ImageIcon(bi);
jL.setIcon(newIcon);
jF.add(jL);
jP.add(jL);
jF.add(jP);
jF.validate();
}

为了在图像之间切换,我使用了一个关键监听器。 keyListner调用开关图像代码。下面给出了两者。

public void switchImage(ImageIcon image, JFrame jF, JLabel jL, JPanel jP, GazeData gazeData){
Image imag = image.getImage();

BufferedImage bi = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.getGraphics();

g.drawImage(imag, 0, 0, 1280, 800, null);
g.setColor(Color.black);
int x = (int) gazeData.smoothedCoordinates.x;
int y = (int) gazeData.smoothedCoordinates.y;
Font font = new Font("Verdana", Font.BOLD, 16);
g.setFont(font);


String text = "hello(" + gazeData.smoothedCoordinates.x + gazeData.smoothedCoordinates.y + ")";
g.drawString(text, x, y);
g.drawString("Fixed Coordinate at (400, 500)", 400, 500);
ImageIcon newIcon = new ImageIcon(bi);
jL.setIcon(newIcon);
jP.add(jL);
jF.validate();
}

@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
// j.switchImage(image, jF, jL, jP, gazeData);
System.out.println("RightDetected");
imageIndex++;

ImageIcon newImage = new ImageIcon(imageList.get(imageIndex));

if(newImage != null){
this.currentImage = newImage;
System.out.println("IMAGE SWITCHED!!!! Current Image="+imageList.get(imageIndex));
j.switchImage(currentImage, j.jF, j.jL, j.jP, currentGazeData);


}

}
}

最佳答案

可能无法解决您的问题,但您的 Swing 编码实践不正确:

jL.setIcon(newIcon);
//jF.add(jL); // remove
jP.add(jL);
jF.add(jP);
jF.validate();

Swing 组件只能有一个父组件。首先,将标签添加到框架和面板。因此标签只会出现在面板上。删除第一条语句。

所有 Swing 组件都应在框架生效之前添加到框架中。因此,删除 validate() 语句并将 setVisible(...) 移至底部。

jL.setIcon(newIcon);
//jP.add(jL);
//jF.validate();

当您更改 Swing 组件的属性时,该组件足够智能,可以重新绘制自身。您所需要做的就是更改标签的图标。无需将标签添加回面板或验证框架。

Others dont seem to show up on the screen at all

也许图片没有找到?

The drawstring seems to work perfectly.

您可以只在标签顶部显示一个标签,而不是创建所有 BufferedImages 并进行自定义绘制。

所以基本代码是:

imageLabel = new JLabel();
imageLabel.setLayout( new FlowLayout() );
textLabel = new JLabel();
imageLabel.add(textLabel);
frame.add(imageLabel);

注意:

  1. imageLabel 可以直接添加到框架中。我看不出您的小组有任何理由。
  2. 要更改图像,您只需调用 imageLabel 上的 setIcon() 方法
  3. 要更改文本,您只需调用 textLabel 上的 setText() 方法

关于java - JFrame 未全屏显示所有图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241380/

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