我正在使用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;
}
}
问题是,当我调整JFrame的大小时,JPanel缩小并且Canvas扩展,
好吧,您告诉我们正在发生的事情,但是您没有告诉我们您应该发生的期望。
我想问题在于您使用权重约束的方式。
根据提供的代码,我建议您不应使用GridBagLayout,而应使用BorderLayout
。
然后将面板添加到框架的代码将是:
add(followTo, BorderLayout.PAGE_START);
add(canvas, BorderLayout.CENTER);
add(controls, Borderlayout.PAGE_END):
现在,随着帧大小的变化,所有空间都将分配给CENTER中的组件。顶部/底部的组件将保持高度固定。
注意,您也不应在代码中使用静态变量。