Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GridBagLayout时不显示画布_Java_User Interface - Fatal编程技术网

Java 使用GridBagLayout时不显示画布

Java 使用GridBagLayout时不显示画布,java,user-interface,Java,User Interface,我制作了一个程序,用2/3的屏幕显示视频,用1/3的屏幕显示评论,所以我使用了GridBagLayout;出于某种原因,画布不会出现,但当我用JButton替换它时,它会工作。你能告诉我怎么解决这个问题吗 重要的部分在Panel类中,另一个代码仅用于指导 最后,我要感谢你对我的帮助 public class Intro extends JFrame{ Panel panel = new Panel(); static Canvas canvas; public Intro()

我制作了一个程序,用2/3的屏幕显示视频,用1/3的屏幕显示评论,所以我使用了GridBagLayout;出于某种原因,画布不会出现,但当我用JButton替换它时,它会工作。你能告诉我怎么解决这个问题吗

重要的部分在Panel类中,另一个代码仅用于指导

最后,我要感谢你对我的帮助

public class Intro extends JFrame{

  Panel panel = new Panel();
  static Canvas canvas;

    public Intro(){
        add(panel);
    }

    public static void receive(Canvas canvas1){
        canvas = canvas1;
    }

    public static void main(String[] args) {
        Intro intro = new Intro();
            intro.setSize(1150, 680);
            intro.setLocationRelativeTo(null);
            intro.setVisible(true);
            intro.setDefaultCloseOperation(EXIT_ON_CLOSE);

        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(),"C:\\Program Files\\VideoLAN\\VLC");
        Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
        MediaPlayerFactory mpf = new MediaPlayerFactory();
        EmbeddedMediaPlayer emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(intro));
        emp.setVideoSurface(mpf.newVideoSurface(canvas));
//        emp.setEnableMouseInputHandling(false);
//        emp.setEnableKeyInputHandling(false);
        emp.prepareMedia("D:\\Crab Rave.mp4");
        emp.play();
    }
}

class Panel extends JPanel{

    JLabel label;

    public Panel(){
      setLayout(new GridBagLayout());

        Canvas canvas = new Canvas();
        canvas.setBackground(Color.BLACK);

        GridBagConstraints gbc = new GridBagConstraints();
          gbc.gridx=0;
          gbc.gridy=0;
          gbc.gridheight=2;
          gbc.fill= GridBagConstraints.VERTICAL;
          gbc.weightx=1;
          gbc.weighty= 1;
          Intro.receive(canvas);
        add(canvas, gbc);

        label = new JLabel("Hi there");
          gbc.gridx=0;
          gbc.gridy=2;
          gbc.gridheight=1;
          gbc.fill= GridBagConstraints.VERTICAL;
          gbc.weightx=1;
          gbc.weighty= 1;
        add(label, gbc);
    }
}
好的,java.awt.Canvas的默认preferredSize为0x0。因此,当您使用gbc.fill=GridBagConstraints.VERTICAL;,它将简单地拉伸画布以填充垂直空间,但不会更改保持为0的宽度

使用gbc.fill=GridBagConstraints.BOTH;反而

旁注。。。 Swing使用轻型组件,这些组件在单个图形对等或重型容器中渲染。这使得Swing组件具有z顺序相互重叠/铺设的概念


java.awt.Canvas是一个很重的组件,这意味着它不支持z-orderng的概念,因此当您不希望它出现在组件顶部时,它可能会出现问题。

您将遇到问题。Canvas是一个重量很重的组件,它不支持z排序,这会影响它的显示方式-请注意。你能在正式回答中解释一下吗?哈哈,这真是我朋友Susan的BTS游戏,因为明天我们将进行圣诞节交换。