JPanels在调整JFrame大小时会缩小

问题描述 投票:0回答:1

我正在使用VLCJ制作视频播放器;在上方和下方,我有两个JPanels来显示一些信息,在中间,我具有播放视频的画布。问题是,当我调整JFrame的大小时,JPanel会收缩,而Canvas会扩展,但是当我放置一个按钮而不是Canvas时,什么都不会改变。您知道在使用GridBagLayout调整JFrame的大小时如何保持JPanels的大小吗?

Snippet:

public class Test extends JFrame {

  static Test frame;
  static Canvas canvas;
  static int video = 1;
  JButton button;

    public Test() {
    setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();

        JPanel followTo = new JPanel();
          gbc.gridy=0;
          gbc.weightx=1;
          gbc.weighty= 0.11;
        add(followTo, gbc);

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

//        button = new JButton();

          gbc.gridy=1;
          gbc.weightx=1;
          gbc.weighty= 1.02;
          gbc.fill= GridBagConstraints.BOTH;
        add(canvas, gbc);
//        add(button, gbc);

        JPanel controls = new JPanel();
          gbc.gridy=2;
          gbc.weightx=1;
          gbc.weighty=0.16;
        add(controls, gbc);
    }

    public static void main(String[] args) {
        frame = new Test();
          frame.setSize(1200-54,864);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // /* Comment when using JButton
        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(frame));
            emp.setVideoSurface(mpf.newVideoSurface(canvas));
            emp.prepareMedia(url("Toulouse.mp4"));
            emp.play();
        // */
    }

    static String url (String video) {
        String mrl = new Object().getClass().getResource("/media/guide.txt").getFile();
        String url = mrl.replace("/", "\\").split("\\\\",2)[1].split("media")[0].concat("media\\"+video);
          return url;
    }
}
java swing vlcj
1个回答
0
投票

问题是,当我调整JFrame的大小时,JPanel缩小并且Canvas扩展,

好吧,您告诉我们正在发生的事情,但是您没有告诉我们您应该发生的期望。

我想问题在于您使用权重约束的方式。

根据提供的代码,我建议您不应使用GridBagLayout,而应使用BorderLayout

然后将面板添加到框架的代码将是:

add(followTo, BorderLayout.PAGE_START);
add(canvas, BorderLayout.CENTER);
add(controls, Borderlayout.PAGE_END):

现在,随着帧大小的变化,所有空间都将分配给CENTER中的组件。顶部/底部的组件将保持高度固定。

注意,您也不应在代码中使用静态变量。

© www.soinside.com 2019 - 2024. All rights reserved.