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;