2010-04-16 10 views
7

मैं एक फॉर्म बनाने के लिए माइगलेआउट का उपयोग कर रहा हूं जिसमें JTextFields (लघु इनपुट उत्तर) के साथ-साथ JTextAreas (लंबा उत्तर) भी हैं। समस्या दो गुना है।स्विंग - JTextField और JTextAreas को कैसे मिलाएं और समान दृश्य उपस्थिति कैसे करें?

  1. स्क्रॉलपेन लिपटे हुए टेक्स्ट क्षेत्र के चारों ओर स्थित सीमा टेक्स्ट फ़ील्ड से मेल नहीं खाती है।
  2. टेक्स्टरेरा/टेक्स्टफील्ड की चौड़ाई और प्लेसमेंट भिन्न है, जिससे उन्हें सही तरीके से लाइन नहीं करना पड़ता है।

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

दाएँ/बाएँ से सही करने के लिए बदलने के बाद/भरने: alt text http://grab.by/3RMk आपको लगता है कि सीमा लाइन अप देख सकते हैं, लेकिन अभी भी अंतराल हैं कि। मैंने novisualpadding सेट करने की कोशिश की लेकिन यह इसे ठीक नहीं किया।

स्रोत कोड:

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

}

जबकि अभी भी दृश्य सद्भाव बनाए रखने के क्या, मिश्रण करने के लिए पसंदीदा तरीका है और मैच JTextField और jtextareas है? अब मुझे पता है कि पाठ क्षेत्र के विपरीत टेक्स्ट फ़ील्ड में इसके चारों ओर एक नीली हाइलाइट है, क्योंकि टेक्स्ट एरिया के विपरीत ... दृश्य विचलन का एक अन्य स्रोत।

उत्तर

0

उत्तर यह है कि मिग लेआउट लोग working on a fix for their next version हैं।

हैलो,

एप्पल डिफ़ॉल्ट रूप से मुआवजा और डेवलपर तय नहीं जाने के एक बुरा habbit है। यह ऐसा मामला है जहां उन्होंने ओएस एक्स की तरह इसे अधिक दृश्यमान बनाने के लिए सीमा जोड़ दी है। यह लेआउट मैनेजर का विकल्प होना चाहिए ...

मिगलाउट इस तरह की दृश्य सीमाओं की भरपाई कर सकता है लेकिन यह केवल के लिए किया जाता है विंडोज एक्सपी में JTabbedPane। मुझे यकीन नहीं है कि यह ओएस एक्स में 100% अच्छा किया जा सकता है। मुझे जांच करनी होगी। हम नहीं चाहते कि टेक्स्ट फ़ील्ड सिर्फ सीमाओं में बढ़े।

मैंने इसे अगले संस्करण के लिए todo सूची में जोड़ा है।

3

सुनिश्चित नहीं है कि आप अपनी सीमा की समस्या को कैसे ठीक कर सकते हैं लेकिन अपनी लेआउट स्थिति को ठीक करने के लिए मैं बस springlayout का उपयोग करूंगा। स्प्रिंगलेआउट जेपीनल के भीतर अपने तत्वों को बेहतर लेआउट करने का एक तरीका है। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं Java Sun Tutorial

विशेष रूप से आप यह निर्धारित करके इसका उपयोग करते हैं कि आप प्रत्येक तत्व के अपने उत्तर, दक्षिण, पश्चिम और पूर्व सीमाओं को कहां चाहते हैं। ऐसा करने के लिए आपको पहले अपनी लेबल कॉल को ऐड से बाहर ले जाना होगा ताकि प्रत्येक को नाम दिया जा सके। तो बजाय:

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

है:

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

अपने तत्वों (JLabels, JTextAreas और JTextField) से प्रत्येक के लिए। एक बार ऐसा करने के बाद आप आसानी से लेआउट सेट कर सकते हैं।

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

फिर प्रत्येक तत्व के लिए आपको अपनी इच्छित सीमाओं को सेट करना होगा। उन्हें दक्षिण, उत्तर, पश्चिम तो पूर्व के विशिष्ट क्रम में होना चाहिए। यद्यपि यदि आप नहीं चाहते हैं तो आपको सभी चार सीमाओं का उपयोग करने की आवश्यकता नहीं है। यहां अपना पहला टेक्स्ट क्षेत्र, शीर्ष पर सेट करने के तरीके पर एक उदाहरण दिया गया है।

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

यह उदाहरण टेक्स्ट क्षेत्र के दक्षिण को सेट नहीं करता है, लेकिन यदि आप चाहते हैं तो इसे पहले होना होगा। पहली पंक्ति शीर्ष क्षेत्र से 10 पिक्सल दूर होने के लिए टेक्स्ट क्षेत्र के उत्तर की तरफ सेट करती है। जब अन्य क्षेत्रों की स्थापना आप लेकिन पिछले (ऊपर) क्षेत्रों के बजाय इस नाम और कहते हैं कि यह पिछले एक के दक्षिण से 10 पिक्सल की दूरी पर है:

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

ऊपर के उदाहरण में दूसरी पंक्ति पूर्व की ओर सेट अपने मुख्य पैनल के माध्यम से आधा रास्ते शुरू करने के लिए टेक्स्ट क्षेत्र का। अंतिम, तीसरी, रेखा टेक्स्ट क्षेत्र के पूर्व की तरफ आपके मुख्य पैनल के पूर्व की तरफ से 10 पिक्सेल हो जाती है।

2

लेआउट समस्या के लिए, के बजाय [right][fill] का columnConstraints मान आज़माएं।

अन्य मुद्दे के लिए, यह एक लुक-एंड-असंगत असंगतता प्रतीत होता है। मैंने विंडोज़ में अपना कोड चलाया, और अंतर भी हैं, लेकिन कम फ्लैगेंट हैं। मेरा सुझाव टेक्स्ट फ़ील्ड और टेक्स्ट क्षेत्रों के लिए स्पष्ट रूप से पहचान सीमाओं को सेट करना होगा।

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

आप MigLayout अपने घटकों संरेखित करने के लिए, का उपयोग कर पर विचार 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

[भरें] मदद करता है। हालांकि, आकार अभी भी मैक ओएसएक्स पर सही नहीं है: http://grab.by/3O9U – I82Much

+1

शायद एक अधिक अनुकूलनीय विकल्प एक घटक प्रकार की पसंदीदा सीमा को अपनाना है और इसे दूसरे पर लागू करना है; उदाहरण के लिए, textField.setBorder (scrollPane.getBorder())। –

+0

java.awt.GridBagLayout देने का प्रयास करें। अधिक कोड के लिए मेरे संशोधित उत्तर देखें। –

2

मुझे पता है कि MiGLAyout (जो मैं प्यार करता हूँ, BTW) दृश्य संरेखण बनाम सख्त पिक्सेल संरेखण के लिए विशेष हैंडलिंग करने की क्षमता है। आप इसमें भाग ले रहे हैं ... इसके लिए 'अल' यूनिट पहचानकर्ता का उपयोग किया जाता है, लेकिन मुझे इसका उपयोग नहीं करना है, इसलिए उदाहरण प्रदान नहीं कर सकते हैं। यह शायद मिग नमूना प्रोजेक्ट को डाउनलोड करने के लायक होगा और देखें कि उनके पास एक ही संरेखण समस्या है (मुझे यकीन है कि उनके पास आपके समान पैनल हैं)।

के लिए क्या इसके लायक है, हम अक्सर एक ही कक्ष में पाठ क्षेत्रों और क्षेत्रों मिश्रण है और इस में चलाने नहीं है ... हम कर के रूप में ही करने के लिए स्क्रॉल फलक की सीमा सेट करने के लिए नोएल एंग द्वारा सुझाए गए पाठ फ़ील्ड की सीमा। बंद +1 स्क्रीन शॉट्स के लिए यकीन नहीं है कि यदि एक फर्क नहीं पड़ता है या नहीं ...

0

पहले -

इसके अलावा, बजाय लेआउट निर्माता में बाधाओं को निर्दिष्ट करने के लिए, हम आम तौर पर उन्हें निर्दिष्ट हम प्रत्येक घटक जोड़ने के रूप में। चूंकि आप मैक का उपयोग कर रहे हैं, क्या आपने क्वाक्वा लुक एंड महसूस किया है? यह टेक्स्टबॉक्स/क्षेत्रों को ठीक से प्रस्तुत करता है।

4

मैं जानता हूँ कि इस सवाल का बहुत पुराना है, लेकिन एक TextArea एक TextField की है कि मैच के लिए के लिए सीमा प्राप्त करने के लिए:

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

यह एक TextField के चारों ओर एक तरह अपने TextArea करने के लिए एक सीमा देना चाहिए ।

+0

अच्छा है! लेकिन यह "नया JTextField() होना चाहिए। GetBorder()" –

संबंधित मुद्दे