GridBagLayout неправильно позиционируется

Я должен создать графический интерфейс в Java для своего класса Software Engineering, но расположение для двух средних камер не то, что я хочу. Прямо сейчас это метки, называемые pCamera1 и pCamera2. Я надеюсь сменить ярлыки на живые потоки камер для ровера.(Если у кого-то есть идеи, как это сделать, я также буду признателен за некоторые советы).

Я пытался вставить изображения, но, видимо, вам нужно 10 повторений, чтобы сделать это... поэтому я постараюсь описать результат для вас. В основном есть две кнопки и одна метка вверху с надписью Отключить, подключить, статус. Внизу две стрелки, которые будут использоваться для смены камер в будущем. В середине моя проблема. Есть большая желтая коробка, которая является панелью, я покрасил ее в желтый цвет для целей отладки. Внутри коробки есть две метки красного цвета, в которых будут отображаться потоки камеры. Эти ярлыки застряли посередине, и в этом заключается моя проблема.

В основном камеры (или этикетки) идут не так, как я хочу. Я установил gridx и gridy на 0 для camera1 на 0, не означает ли это, что метка должна идти в верхнем левом углу желтого поля, так как желтый блок это панель? Это не так. Я также установил для gridwidth значение 2, чтобы попытаться охватить два столбца. Это не так. Gridx и gridy работают для других надписей и кнопок, поэтому я понятия не имею, почему это не работает. Я пошел и установил ipady и ipadx на 400, и это сработало, но это только временно, так как после того, как вы изменили его размер, это выглядит ужасно. Ну все равно вот мой код:

package rover.gui;
import javax.swing.JOptionPane;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author Matt
 */
public class RoverGUI {

    private JFrame f; //The window
    private JPanel p; //Stuff inside the window(Its a div essentially)
    private JPanel pCameras;
    private JPanel pPanCamera;
    private JLabel pCamera1;
    private JLabel pCamera2;

    private JButton connect;
    private JButton disConnect;
    private JButton cameraR;
    private JButton cameraL;

    private JLabel lab;
    private JButton temp;

    String connected = "Inactive";

    public RoverGUI() {
        gui();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        new RoverGUI();
       /* String fn = JOptionPane.showInputDialog("Enter first number"); //Entered number is stored in string fn.

        JOptionPane.showMessageDialog(null, "The answer is " + fn, "The title",""); //p(position on screen, null = center, message, title bar)
        // TODO code application logic here*/
    }

    public void gui() {


        f = new JFrame("Rover");
        f.setVisible(true);
        f.setSize(600, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //allows you to close the GUI.

        p = new JPanel(new GridBagLayout());
        pCameras = new JPanel(new GridBagLayout());
        pPanCamera = new JPanel(new GridBagLayout());
        //pCameras = new JPanel(new GridBagLayout());

        pCameras.setBackground(Color.YELLOW);
        //pCamera1.setBackground(Color.RED);
        //pCamera2.setBackground(Color.RED);

        GridBagConstraints c = new GridBagConstraints();//GridBagConstraint is a specific way of arranging the objects in java.
        c.fill = GridBagConstraints.HORIZONTAL;
        c.fill = GridBagConstraints.VERTICAL;

        connect = new JButton("Connect");
        disConnect = new JButton("Disconnect");
        cameraR = new JButton(">>");
        cameraL = new JButton("<<");
        lab = new JLabel("Status: " + connected);
        temp = new JButton("Camera feed goes here");
        pCamera1 = new JLabel("Camera 1");
        pCamera1.setBackground(Color.red);
        pCamera1.setOpaque(true);
        pCamera2= new JLabel("Camera 2");
        pCamera2.setBackground(Color.red);
        pCamera2.setOpaque(true);


        connect.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null, "connect");
                connected = "Active";
                lab.setText("Status: " + connected);
            }
        });

        disConnect.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null, "disConnect");
                connected = "Inactive";
                lab.setText("Status: " + connected);

            }
        });

        cameraR.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Right");
            }
        });

        cameraL.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Left");
            }
        });



        //Add button & label to panel; add panel to frame.
        c.insets = new Insets(10,10,10,10);//makes buttons have margins(top, left, right, bottom)

        c.gridx = 0; //Set the x axis for the object
        c.gridy = 0; //Set the y axis for the object
        p.add(disConnect, c);

        c.gridx = 1; //Set the x axis for the object
        c.gridy = 0; //Set the y axis for the object
        p.add(connect, c);

        c.gridx = 0; //Set the x axis for the object
        c.gridy = 0; //Set the y axis for the object
        pPanCamera.add(cameraL, c);

        c.gridx = 1; //Set the x axis for the object
        c.gridy = 0; //Set the y axis for the object
        pPanCamera.add(cameraR, c);

        c.gridx = 2;
        c.gridy = 0;
        p.add(lab, c);

        //Problem starts here
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;

        pCameras.add(pCamera1, c);

        c.gridx = 2;
        c.gridy = 0;
        c.gridwidth = 2;

        pCameras.add(pCamera2, c);
        //Problem ends here

        f.add(p,BorderLayout.NORTH);
        f.add(pPanCamera, BorderLayout.SOUTH);
        //f.add(pCamera1, BorderLayout.WEST);
        //f.add(pCamera2, BorderLayout.EAST);
        f.add(pCameras, BorderLayout.CENTER);


    }

}

Спасибо вам за помощь!

1 ответ

Решение

По сути, вам нужно указать, как оставшееся пространство будет выделяться вашим компонентам и как компоненты должны заполнять это пространство, попробуйте добавить следующее в ваши ограничения для обеих камер...

c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
Другие вопросы по тегам