tôi đang cố gắng để tạo ra các giao diện sau:GridBagLayout gridding không làm việc
nhưng GUI mà tôi mắc phải là:
gì lưới của tôi trông giống như:
image: THE GRIDLAYOUT FOR THIS
Tôi không hiểu tại sao tôi nhận được kết quả này vì tôi đã vẽ một sơ đồ để hỗ trợ mã và dường như nó hoạt động.
Phương thức addComp bổ sung thêm thành phần đầu vào vào bảng nhập ở vị trí (x, y) nhất định và ở chiều rộng và chiều cao thành phần nhất định.
Code:
import javax.swing.*;
import java.awt.*;
public class GUIError extends JFrame {
//initialise all the components
JPanel mainPanel = new JPanel();
JTextField txtDisplay = new JTextField();
JButton btnA = new JButton("A");
JButton btnB = new JButton("B");
JButton btnC = new JButton("C");
JButton btnD = new JButton("D");
JButton btnE = new JButton("E");
JButton btnF = new JButton("F");
JButton btnWA = new JButton("WA");
JButton btnWB = new JButton("WB");
JButton btnWC = new JButton("WC");
JButton btnWD = new JButton("WD");
private void addComp(JPanel panel, JComponent comp, int xPos, int yPos, int compWidth, int compHeight) {
GridBagConstraints gridConstraints = new GridBagConstraints();
gridConstraints.gridx = xPos;
gridConstraints.gridy = yPos;
gridConstraints.gridwidth = compWidth;
gridConstraints.gridheight = compHeight;
gridConstraints.weightx = 0.5;
gridConstraints.weighty = 0.5;
gridConstraints.insets = new Insets(5, 5, 5, 5);
gridConstraints.anchor = GridBagConstraints.CENTER;
gridConstraints.fill = GridBagConstraints.BOTH;
panel.add(comp, gridConstraints);
}
public static void main(String[] args) {
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (Exception e) { }
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// create frame
JFrame frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
Container c = frame.getContentPane();
// create GUI within frame
new GUIError(c);
// finish frame definition
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
});
}
public GUIError(Container cont) {
cont.setPreferredSize(new Dimension(610, 250));
// parent panel containes every other panel
mainPanel.setLayout(new GridBagLayout());
// text display
txtDisplay.setEditable(false);
addComp(mainPanel, txtDisplay, 0, 0, 12, 2); // width 16, height 2
addComp(mainPanel, btnA, 0, 2, 2, 1);
addComp(mainPanel, btnB, 2, 2, 2, 1);
addComp(mainPanel, btnC, 4, 2, 2, 1);
addComp(mainPanel, btnD, 6, 2, 2, 1);
addComp(mainPanel, btnE, 8, 2, 2, 1);
addComp(mainPanel, btnF, 10, 2, 2, 1);
addComp(mainPanel, btnWA, 0, 3, 3, 1);
addComp(mainPanel, btnWB, 3, 3, 3, 1);
addComp(mainPanel, btnWC, 6, 3, 3, 1);
addComp(mainPanel, btnWD, 9, 3, 3, 1);
cont.add(mainPanel);
}
}
GBC dựa trên cột, +1 cho câu hỏi và SSCCE/MCVE, lý do tại sao MigLayout (e.i.) được phát triển – mKorbel
Đừng nghĩ rằng bạn có thể đạt được điều này chỉ với 1 bảng điều khiển. 'gridwidth' không thể chỉ định" nửa lưới "theo như tôi biết. Tôi nghĩ lựa chọn tốt nhất là sử dụng bố cục khác hoặc tách các thành phần của bạn thành các bảng khác nhau (bảng chính chứa một trường ở trên cùng và 2 ô bên dưới (cạnh nhau). Mỗi bảng con có 2 bảng: một bảng cho 3 các nút nhỏ hơn, một với 2 nút lớn hơn bên dưới) –
Tôi chưa chỉ định một nửa lưới bằng cách sử dụng lưới thông rộng. Dòng đầu tiên của các nút là gridwidth = 2 và dòng thứ ba của các nút là gridwidth = 3. Tôi không hiểu ý bạn là gì bởi 3 nút nhỏ hơn và 2 lớn hơn ở phía dưới? Lưới mà tôi cũng đã liên kết hiển thị lưới mà tôi đã sử dụng trong tình huống này. Hàng thứ hai của các nút có cùng kích thước, hàng thứ ba của các nút có cùng kích thước. Tôi không hiểu tại sao điều này sẽ không hoạt động với GridBagLayout. – user3749872