首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFrame不全屏显示所有图像

JFrame不全屏显示所有图像
EN

Stack Overflow用户
提问于 2016-12-20 19:33:27
回答 1查看 96关注 0票数 0

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

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

代码语言:javascript
复制
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调用交换机镜像代码。下面给出了这两种方法。

代码语言:javascript
复制
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);


        }

    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-12-20 23:43:48

可能不会解决你的问题,但是你有不正确的Swing编码实践:

代码语言:javascript
复制
jL.setIcon(newIcon);
//jF.add(jL); // remove
jP.add(jL);
jF.add(jP);
jF.validate(); 

一个Swing组件只能有一个父级。首先,将标签添加到框架,并将添加到面板。所以标签只会出现在面板上。去掉第一句话。

在框架生效之前,应将所有Swing组件添加到框架中。所以去掉validate()语句并移动setVisible(...)放到最下面。

代码语言:javascript
复制
jL.setIcon(newIcon);
//jP.add(jL);
//jF.validate();  

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

其他人似乎根本没有出现在屏幕上

也许没有找到图像?

拉绳似乎工作得很完美。

而不是创建所有的BufferedImages和做自定义绘画,您可以只显示标签在您的标签上。

所以基本代码是:

代码语言:javascript
复制
imageLabel = new JLabel();
imageLabel.setLayout( new FlowLayout() );
textLabel = new JLabel();
imageLabel.add(textLabel);
frame.add(imageLabel);

注意:

  1. imageLabel可以直接添加到框架中。
  2. 要更改图像,只需在imageLabel
  3. To上调用setIcon()方法更改刚刚在textLabel

上调用setText()方法的文本

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41241380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档