2012-12-19 36 views
5

Tôi đang cố sắp xếp hai bộ nút cho GUI máy tính. Mỗi người sử dụng GroupLayout để tạo ra chúng. Một bộ là số (và "."), Cái còn lại dành cho các nút thao tác. Điều này về cơ bản hoạt động nhưng nếu một trong các nút có chiều dài gấp đôi (ví dụ như nút bằng trên bộ hoạt động của tôi) nó ném các nút khác ra khỏi dòng. Tôi sẽ sử dụng bộ thao tác làm ví dụ. Có hai cột và bốn hàng nút. Hàng cuối cùng chỉ có một nút - bằng. Tôi muốn làm cho chiều dài tăng gấp đôi này trải dài trên cả hai cột. Tại thời điểm này, nó chỉ đơn giản là đẩy cột thứ hai đến cuối của nó khi tôi muốn cột thứ hai ngồi trên nó.Java - Trộn kích thước thành phần trong GroupLayout

Đây là mã cho bố cục - operLayout là tên của bố cục cho các phép toán, dấu ngoặc trái và phải trên hàng đầu tiên, + và - vào thứ hai, * và/trên thứ ba và bằng trên hàng cuối cùng . Mỗi nút có kích thước tối thiểu được đặt ở nơi khác (tất cả chúng đều giống nhau trừ ngoại lệ bằng hai lần).

operLayout.setAutoCreateGaps(true); 
operLayout.setAutoCreateContainerGaps(true); 
operLayout.setVerticalGroup(operLayout 
     .createSequentialGroup() 
     .addGroup(
operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(leftBracket) 
          .addComponent(rightBracket)) 
      .addGroup(operLayout.createParallelGroup().addComponent(add).addComponent(subtract)) 
      .addGroup(operLayout.createParallelGroup().addComponent(multiply).addComponent(divide)) 
      .addGroup(operLayout.createParallelGroup().addComponent(equals))); 
    operLayout.setHorizontalGroup(operLayout 
      .createSequentialGroup() 
      .addGroup(
        operLayout.createParallelGroup().addComponent(leftBracket).addComponent(add) 
          .addComponent(multiply).addComponent(equals)) 
      .addGroup(
        operLayout.createParallelGroup().addComponent(rightBracket).addComponent(subtract) 
          .addComponent(divide))); 

Tôi hiểu tại sao điều này xảy ra nhưng tôi không chắc chắn cách sắp xếp. Có cách nào đơn giản không? Hay tôi nên thay đổi cách tôi đang làm nó? Cảm ơn

+0

Tôi hoan nghênh bạn cho lựa chọn 'GroupLayout' cho tác vụ này. Tôi tin rằng cách bố trí này là mạnh nhất để đặt ra các biểu mẫu chuẩn. Nó dễ dàng bị bỏ qua vì nó rất phức tạp để sử dụng. Sau khi học cách nó hoạt động, tôi sử dụng nó gần như độc quyền. –

+0

có thể định dạng lại mã của bạn? Hiện tại, y nó không thể đọc được. – ArtB

+0

có, xin vui lòng, mặc dù ai đó có thể đã đánh bại bạn với nó. Cảm ơn bạn @ErickRobertson, tôi biết ý bạn là gì, có vẻ phức tạp nhưng một khi bạn hiểu nó, nó thực sự hữu ích! – PatrickJBC

Trả lời

3

Đặt thành phần equals vào nhóm ngang song song của riêng nó.

Trước hết, hãy đảm bảo bạn sử dụng thụt đầu dòng nhất quán khi bạn đang sử dụng GroupLayout. Tôi đã tìm thấy điều này hoàn toàn quan trọng trong việc theo dõi những gì đang xảy ra.

Lý do bạn thấy hành vi bạn báo cáo là do dấu bằng là một phần của cùng một nhóm song song ngang làm cột đầu tiên của nút. Vì vậy, khi bạn làm cho nó rộng gấp đôi, nó sẽ đẩy cột thứ hai của các nút sang bên phải. Đây chính xác là những gì bạn đang nói với nó vì bạn đang bảo nó ở trong nhóm song song đầu tiên (cột).

Để có được hành vi bạn muốn, bạn phải bố trí nút đó một cách riêng biệt, song song với các nút khác. Bạn làm điều này bằng cách đặt nó vào nhóm song song riêng của nó. Bạn có thể muốn đặt một liên kết trên nhóm này cũng để có được hành vi tốt nhất. Tôi nghĩ rằng GroupLayout.Alignment.CENTER là những gì bạn muốn.

Cũng lưu ý rằng bạn không cần phải tạo nhóm mới nếu nó chỉ có một thành phần trong đó. Chỉ cần thêm thành phần đó thay thế.

operLayout.setVerticalGroup(operLayout.createSequentialGroup() 
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
     .addComponent(leftBracket) 
     .addComponent(rightBracket)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(add) 
     .addComponent(subtract)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(multiply) 
     .addComponent(divide)) 
    .addComponent(equals)); 
operLayout.setHorizontalGroup(operLayout.createParallelGroup() 
    .addGroup(operLayout.createSequentialGroup() 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(leftBracket) 
      .addComponent(add) 
      .addComponent(multiply)) 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(rightBracket) 
      .addComponent(subtract) 
      .addComponent(divide))) 
    .addComponent(equals)); 
+0

cảm ơn sự giúp đỡ của bạn! vâng, tôi nhận ra đó là những gì tôi đã nói với nó, kết quả tôi nhận được không làm tôi ngạc nhiên, tôi chỉ không chắc chắn làm thế nào để sắp xếp lại để làm cho nó đúng. Tôi không hoàn toàn hiểu những gì bạn đang nói để làm mặc dù như bạn nói để đặt nó trong nhóm riêng của nó song song (ngang hoặc dọc? Tôi sẽ giả định theo chiều dọc hoặc có thể cả hai?) Nhưng sau đó bạn nói rằng nếu nó là một thành phần nó doesn ' t cần một nhóm. Tôi đã thử mã bạn đã đưa ra cũng như các biến thể về những gì bạn đã nói với các nhóm/chỉ thành phần, sử dụng căn giữa nhưng không có thay đổi về những gì tôi có. – PatrickJBC

+0

okay xin lỗi chỉ nhận ra bạn nói ngang để bắt đầu với nhưng làm điều đó không giải quyết được vấn đề. – PatrickJBC

+0

Tôi không biết tại sao điều này không giải quyết được vấn đề cho bạn.Hãy chắc chắn rằng các thụt đầu dòng của bạn thẳng hàng với các dấu ngoặc đơn để bạn thêm thành phần vào nhóm thích hợp. Nó nên được thêm vào song song với nhóm tuần tự có chứa hai cột trong nhóm ngang. Điều này làm việc, vì vậy tôi không chắc chắn những gì bạn đang làm khác nhau. Nhưng tôi sẽ không ngạc nhiên nếu nó ở sai vị trí dựa trên cách mã ban đầu được tổ chức. –

Các vấn đề liên quan