JPanels уменьшаются при изменении размера JFrame - PullRequest
0 голосов
/ 05 апреля 2020

Я делаю видеоплеер с VLCJ; выше и ниже у меня есть два JPanels для отображения некоторой информации, а в середине у меня есть холст, где воспроизводится видео. Проблема в том, что когда я изменяю размер JFrame, JPanels уменьшаются, а Canvas расширяется, но когда я помещаю кнопку вместо Canvas, ничего не меняется. Знаете ли вы, как сохранить размер JPanels при изменении размера JFrame с помощью GridBagLayout?

Фрагмент:

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;
    }
}

1 Ответ

1 голос
/ 05 апреля 2020

Проблема в том, что когда я изменяю размер JFrame, JPanels сокращается, а Canvas расширяется,

Хорошо, вы говорите нам, что происходит, но вы не сказали нам, что вы ОЖИДАЕТЕ, что должно произойти.

Я думаю, проблема в том, как вы используете весомые ограничения.

Исходя из предоставленного кода, я бы предложил, чтобы вы НЕ использовали GridBagLayout, а вместо этого использовали BorderLayout.

Тогда код для добавления панелей к фрейму будет просто:

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

Теперь, когда размер кадра изменится, все пространство будет отдано компоненту в ЦЕНТРЕ. Компоненты сверху / снизу останутся фиксированными по высоте.

Обратите внимание, что вы также НЕ должны использовать переменные stati c в своем коде.

...