2010-04-16 22 views
7

JtextFields (kısa giriş cevapları) ve JTextAreas (Daha uzun cevaplar) olduğu bir form oluşturmak için miglayout kullanıyorum. Sorun iki yönlüdür.Salıncak - JTextField ve JTextAreas nasıl karıştırılır ve aynı görsel görünüme sahiptir?

  1. Scrollpane sarılı metin alanının etrafına yerleştirilen kenarlık, bir Metin Alanı ile uyuşmuyor.
  2. Textarea/textfield'in genişliği ve yerleşimi, bunların düzgün bir şekilde hizalanmasına neden olmadan farklılık gösterir. alt text http://grab.by/3RMk Sen sınırları hizaya olduğunu görebilirsiniz, ama yine de boşluklar olduğunu: sağa sola/sağa gelen değiştirdikten sonra

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

/doldurun. Görünmez bir panel kurmayı denedim ama bu düzeltmedi.

Kaynak kodu:

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); 
} 

}

hala görsel bir uyum korurken tercih karıştırmak için bir yol ve maç JTextField ve jtextareas, nedir? Metin alanının, odakta olduğu zaman, metin alanının tersine mavi bir vurgunun bulunduğunu fark ettim ... başka bir görsel süreksizlik kaynağı.

cevap

0

Yanıt, MiG Layout kişilerin working on a fix for their next version.

Merhaba

,

Apple geliştirici karar versin varsayılan olarak telafi değil gibi kötü alışkanlığının vardır. Bu, OS X gibi daha görsel hale getirmek için bir sınır ekledikleri böyle bir durumdur. Bu, mizanpaj yöneticisinin tercihi olmalıdır ...

MigLayout, bu gibi görsel sınırları telafi edebilir ancak yalnızca Windows XP'de JTabbedPane. OS X'de% 100 iyi yapılabilir emin değilim. Kontrol etmeliyim. Metin alanının sadece sınırlar içinde büyümesini istemiyoruz.

Bunu bir sonraki sürüme yönelik yapılacaklar listesine ekledim. Bir TextField etrafında bir gibi senin TextArea kenarlık vermelidir

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

:

3

Kenarlık sorununuzu nasıl düzeltebildiğinizden emin değil, ancak düzen durumunuzu düzeltmek için springlayout'u kullanırdım. Springlayout, öğelerinizi JPanel içinde daha iyi yerleştirmenin bir yoludur. Bu konuda daha fazla bilgi alabilirsiniz Java Sun Tutorial

Özellikle, her bir öğenin Kuzey, Güney, Batı ve Doğu sınırlarınızı istediğiniz yeri ayarlayarak kullanabilirsiniz. Bunu yapmak için öncelikle etiket çağrılarınızı her birinin isimlendirilebilmesi için eklentiden çıkarmanız gerekir. Bunu yerine:

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

Do: En elemanları (JLabels, JTextAreas ve JTextField) her biri için

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

. Bu yapıldıktan sonra düzeni kolayca ayarlayabilirsiniz.

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

Ardından, istediğiniz öğelerin herhangi birini ayarlamak zorunda olduğunuz öğelerin her biri için. Güneyde, Kuzeyde, Batıda ve doğuda belirli bir düzende olmalılar. Eğer istemiyorsan, dört sınırı da kullanmak zorunda değilsin. İlk metin alanınızı nasıl ayarlayacağınıza dair bir örnek.

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); 

Bu örnek, metin alanının güneyini ayarlamaz, ancak eğer bunu yapmak istiyorsanız ilk önce olması gerekir. İlk satır, metin alanının kuzey tarafını üstten 10 piksel olacak şekilde ayarlar. diğer alanlar ancak ayarlarken önceki (üstte) alanlar yerine bu isim ve 10 piksel uzakta bir öncekinin güneyden olduğunu söylemek:

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

yukarıdaki örnekte ikinci satır doğu tarafında ayarlar Metin alanının ana panonuzun yarısına kadar başlaması. Son, üçüncü satır, metin alanının doğu tarafını ana panelinizin doğu tarafından 10 piksel olacak şekilde ayarlar.

2

Düzen sorunu için, [right][left] yerine columnConstraints değerini [right][fill] değerini deneyin.

Diğer sorun için, bu, bir görünüm ve tutarsızlık gibi görünüyor. Kodunuzu Windows'da çalıştırdım ve farklılıklar da var ama daha az açık. Benim önerim metin alanları ve metin alanları için açık bir şekilde sınırlar koymak olacaktır.

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

kullandığınız dikkate java.awt.GridBagLayout sizin parçaları düzeltmek zorunda MigLayout alamıyorsanız:

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

[Doldur] yardımcı olur. Ancak, boyut hala Mac OSX'te mükemmel değil: http://grab.by/3O9U – I82Much

+1

Belki de daha uyumlu bir alternatif, bir bileşen tipinin tercih edilen sınırını benimsemek ve diğerine uygulamak; ör., textField.setBorder (scrollPane.getBorder()). –

+0

Bir java.awt.GridBag vermeyi deneyin. Daha fazla kod için değiştirilmiş cevabı gör. –

2

biliyorum ki MiGLAyout (hangi ı love BTW) görsel hizalama ve katı piksel hizalama için özel işlem yapabilme yeteneğine sahiptir. Buna koşuyor olabilirsiniz ... Bunun için 'al' birim tanımlayıcısı kullanılır, ancak kullanmak zorunda olmadığım için örnekler veremiyorum. Muhtemelen MiG örnek projesini indirmeye ve aynı hizalama sorununa sahip olup olmadıklarına bakmaya değecektir (sizinkiyle benzer panellere sahip olduklarından eminim).

Değeri ne olursa olsun, metin panellerini ve alanları aynı panelde sık sık karıştırıp bu işe karışmıyoruz ... We do kaydırma bölmesinin kenarlığını, Noel Ang'in önerdiği gibi metin alanının sınırı. bu bir fark yaratır ya da değil emin değilim ekran görüntüleri için ... +1

0

Önce kapalı - her bileşen eklemek olarak

Ayrıca, yerine düzen yapıcısındaki kısıtlamaları belirtmek, genellikle onları belirtin. Mac'i kullandığınızdan beri Quaqua Look And Feel'i denediniz mi? Metin kutularını/alanlarını düzgün bir şekilde oluşturur.

4

Bu soru oldukça eski, ama TextArea bir TextField eşleşecek için sınır almak için biliyorum .

+0

Güzel olan! Ama "yeni JTextField(). GetBorder()" olmalıdır. –