2010-04-16 34 views
7

Tôi đang sử dụng miglayout để tạo biểu mẫu trong đó có JTextFields (câu trả lời đầu vào ngắn) cũng như JTextAreas (Câu trả lời dài hơn). Vấn đề là gấp đôi.Swing - làm thế nào để kết hợp JTextField và JTextAreas và có ngoại hình giống nhau?

  1. Đường viền được đặt xung quanh vùng văn bản được cuộn trong Scrollpane không khớp với vùng văn bản.
  2. Chiều rộng và vị trí của textarea/textfield khác nhau, khiến chúng không xếp hàng chính xác.

alt text http://grab.by/3O0V

Sau khi thay đổi từ phải/trái sang phải/điền: alt text http://grab.by/3RMk Bạn có thể thấy rằng các giới hạn xếp hàng, nhưng điều đó vẫn còn những khoảng trống. Tôi đã thử cài đặt novisualpadding nhưng điều này không khắc phục được. đang

Nguồn:

package test2; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import net.miginfocom.swing.MigLayout; 

public class Test extends JPanel { 

private static final int NUM_CHARACTERS_WIDTH = 20; 
private static final int NUM_ROWS = 5; 
public Test() { 

    setLayout(new MigLayout(
      "wrap 2", 
      // Align text labels on the so their right edge meets left edge of the text fields 
      "[right][left]" 
      )); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("No scrollpane text area:")); 
    add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("Scrollpane text area:")); 
    add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH))); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

} 


public static void main(String[] args) { 
    JFrame frame = new JFrame(""); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new Test(); 
    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
} 

}

cách ưa thích để trộn và kết hợp JTextField và jtextareas là gì, trong khi vẫn duy trì sự hài hòa hình ảnh? Bây giờ tôi nhận thấy rằng trường văn bản có một điểm nhấn màu xanh xung quanh nó khi lấy nét ở trong đó, trái ngược với vùng văn bản ... một nguồn gián đoạn hình ảnh khác.

Trả lời

0

Câu trả lời là các bố cục MiG là working on a fix for their next version.

Xin chào,

Apple có habbit khó chịu của bồi thường theo mặc định và không cho phép các nhà phát triển quyết định. Đây là trường hợp như vậy mà họ đã thêm một biên giới để làm cho nó trực quan hơn như OS X. Điều này sẽ là sự lựa chọn của người quản lý bố trí ...

MigLayout có thể bù đắp cho giới hạn thị giác như thế này nhưng nó chỉ được thực hiện cho JTabbedPane trong Windows XP. Tôi không chắc chắn nó có thể được thực hiện 100% tốt trong OS X mặc dù. Tôi sẽ phải kiểm tra. Chúng tôi không muốn trường văn bản chỉ phát triển thành giới hạn.

Tôi đã thêm điều này vào danh sách việc cần làm cho phiên bản tiếp theo.

3

Không chắc chắn cách bạn có thể khắc phục sự cố biên giới của mình nhưng để khắc phục tình huống bố cục của bạn, tôi chỉ sử dụng springlayout. Springlayout chỉ là một cách để bố trí tốt hơn các phần tử của bạn trong JPanel. Bạn có thể tìm hiểu thêm về nó Java Sun Tutorial

Cụ thể là bạn sử dụng nó bằng cách đặt nơi bạn muốn biên giới Bắc, Nam, Tây và Đông của mỗi phần tử. Để làm điều này, trước tiên bạn sẽ phải thực hiện cuộc gọi nhãn của mình trong phần thêm để mỗi tên có thể được đặt tên. Vì vậy, thay vì:

add(new JLabel("Text field:")); 

Đỗ:

JLabel myLabelName = new JLabel("Text field:"); 
add(myLabelName); 

Đối với mỗi yếu tố của bạn (JLabels, JTextAreas và JTextField). Một khi điều này được thực hiện, bạn có thể dễ dàng thiết lập bố trí.

Springlayout layout = new SpringLayout(); 
setLayout(layout); 

Sau đó, cho mỗi phần tử bạn phải đặt bất kỳ đường viền nào bạn muốn. Họ phải theo thứ tự cụ thể Nam, Bắc, Tây rồi Đông. Mặc dù bạn không phải sử dụng tất cả bốn biên giới nếu bạn không muốn. Đây là một ví dụ về cách thiết lập vùng văn bản đầu tiên của bạn, vùng văn bản ở trên cùng.

layout.putConstraint(SpringLayout.NORTH, FirstTextAreaName, 10, SpringLayout.NORTH, this); 
layout.putConstraint(SpringLayout.WEST, FirstTextAreaName, this.getWidth()/2, SpringLayout.WEST, this); 
layout.putConstraint(SpringLayout.EAST, FirstTextAreaName, -10, SpringLayout.EAST, this); 

Ví dụ này không đặt ở phía nam của vùng văn bản nhưng nếu bạn muốn nó phải là đầu tiên. Dòng đầu tiên đặt phía bắc của vùng văn bản cách đỉnh đầu 10 pixel. Khi thiết lập các lĩnh vực khác mà bạn nhưng (ở trên) khu vực trước tên thay vì điều này và nói nó là 10 pixel đi từ phía nam của trước một:

layout.putConstraint(SpringLayout.NORTH, SecondTextAreaName, 10, SpringLayout.SOUTH, FirstTextAreaName); 

Dòng thứ hai trong ví dụ trên đặt phía đông của vùng văn bản để bắt đầu nửa chừng bảng điều khiển chính của bạn. Dòng cuối cùng, thứ ba, đặt phía đông của vùng văn bản là 10 pixel từ phía đông của bảng điều khiển chính của bạn.

2

Đối với sự cố bố cục, hãy thử giá trị columnConstraints của [right][fill] thay vì [right][left].

Đối với vấn đề khác, điều này có vẻ không nhất quán. Tôi chạy mã của bạn trong Windows, và sự khác biệt là có quá, nhưng ít hơn flagrant. Đề xuất của tôi là đặt đường viền nhận dạng rõ ràng cho các trường văn bản và vùng văn bản.

setLayout(new MigLayout(
     "wrap 2", 
     "[right][fill]" 
     )); 

JTextField textField; 
JScrollPane scrollPane; 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

add(new JLabel("No scrollpane text area:")); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

add(new JLabel("Scrollpane text area:")); 
scrollPane = new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 
scrollPane.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(scrollPane); 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

Identicial borders http://img412.imageshack.us/img412/6341/clipboard01jl.png

Nếu bạn không thể nhận MigLayout để gắn kết các thành phần của bạn, xem xét sử dụng java.awt.GridBagLayout:

import static java.awt.GridBagConstraints.*; 

setLayout(new GridBagLayout()); 

GridBagConstraints leftCons = new GridBagConstraints(); 
leftCons.anchor = NORTHEAST; 
leftCons.fill = NONE; 
leftCons.weightx = 1.0; 
leftCons.gridy = RELATIVE; 
leftCons.gridx = 0; 
leftCons.insets = new Insets(4, 8, 4, 8); 

GridBagConstraints rightCons = new GridBagConstraints(); 
rightCons.anchor = NORTHWEST; 
rightCons.fill = HORIZONTAL; 
rightCons.weightx = 1.0; 
rightCons.gridy = RELATIVE; 
rightCons.gridx = 1; 
rightCons.insets = leftCons.insets; 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("No scrollpane text area:"), leftCons); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("Scrollpane text area:"), leftCons); 
add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)), rightCons); 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 
+0

[fill] giúp. Tuy nhiên, kích thước vẫn không hoàn hảo trên Mac OSX: http://grab.by/3O9U – I82Much

+1

Có lẽ một giải pháp thay thế thích hợp hơn là áp dụng đường viền ưa thích của một loại thành phần và áp dụng cho loại khác; ví dụ: textField.setBorder (scrollPane.getBorder()). –

+0

Xem xét việc thử java.awt.GridBagLayout. Xem câu trả lời đã sửa đổi của tôi để biết thêm mã. –

2

Tôi biết rằng MiGLAyout (mà tôi yêu, BTW) có khả năng xử lý đặc biệt để căn chỉnh trực quan và căn chỉnh pixel chặt chẽ. Bạn có thể chạy vào điều này ... Định danh đơn vị 'al' được sử dụng cho điều này, nhưng tôi không phải sử dụng nó để không thể cung cấp các ví dụ. Nó có lẽ sẽ đáng để tải về dự án mẫu MiG và xem chúng có cùng một vấn đề liên kết hay không (tôi chắc rằng chúng có các bảng tương tự như của bạn).

Đối với những gì đáng giá, chúng tôi kết hợp các trường văn bản và các khu vực trong cùng một bảng khá thường xuyên và không chạy vào ... Chúng tôi do phải đặt đường viền của ngăn cuộn giống với đường viền của trường văn bản theo đề xuất của Noel Ang.

Ngoài ra, thay vì quy định cụ thể những hạn chế trong các nhà xây dựng bố trí, chúng ta thường xác định chúng như chúng ta thêm mỗi thành phần - không chắc chắn nếu mà làm cho một sự khác biệt hay không ...

0

Trước hết 1 cho ảnh chụp màn hình. Vì bạn đang sử dụng Mac, bạn đã thử Quaqua Look And Feel chưa? Nó hiển thị các hộp văn bản/khu vực một cách chính xác.

4

Tôi biết câu hỏi này là khá cũ, nhưng để có được biên giới cho một TextArea để phù hợp với một TextField:

(myTextArea).setBorder(new TextField().getBorder()); 

Điều đó sẽ đưa ra một biên giới để TextArea của bạn như ai xung quanh một TextField .

+0

Đẹp nhất! Nhưng nó phải là "JTextField mới(). GetBorder()" –

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