JFrame无法全屏显示所有图像

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

关于代码的注意事项:我所拥有的绘制字符串用于测试坐标。 我正在使用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调用switch图像代码。 两者都在下面给出。

 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组件的属性时,该组件足够智能以重新绘制自身。 您需要做的就是更改标签的图标。 无需将标签添加回面板或validation()框架。

其他人似乎根本不会出现在屏幕上

也许找不到图像?

束带似乎完美无缺。

您可以在标签上方显示标签,而不是创建所有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()方法