2009-06-21 12 views
10

मेरे पास एक समग्र तत्व है, जिसमें प्रारंभ में लेबल होता है। अब मैं इसे (लेबल) पर निपटान करता हूं और उसी कंटेनर (समग्र एल्म) में एक और लेबल बनाता हूं, लेकिन मुझे नया टेक्स्ट नहीं दिखाई देता है। यह मुझे सवाल उठाने के लिए लाता है कि मैं समग्र पर रेड्रो कैसे सक्षम करूं, ताकि नया लेबल (या कोई अन्य घटक जो मैं बना सकता हूं) पुराने स्थान पर प्रस्तुत किया जाएगा। यहाँ कोड मैं (एक समग्र पुनः बनाने के लिए एक इकाई परीक्षण में विभाजित)एसडब्लूटी कंपोजिट - रेड्रो समस्या

private Label createLabel(Composite parent) { 
    Label label = new Label(parent, SWT.NONE); 
    label.setAlignment(SWT.CENTER); 
    label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); 
    return label; 
} 

private void changeText() { 
    assert testCell != null : "Please initialize test cell"; 
    testCell.getChildren()[0].dispose(); 
    Label l = createLabel(testCell); 
    l.setText("New TexT"); 
    testCell.redraw(); 
} 

private void draw() { 
    Display display = new Display(); 
    shell = new Shell(display); 
    shell.setLayout(new GridLayout(2,false)); 

    testCell = new Composite(shell,SWT.BORDER); 
    testCell.setLayout(new GridLayout()); 
    Label l = createLabel(testCell); 
    l.setText("Old Text"); 
    Composite btnCell = new Composite(shell,SWT.NONE); 
    btnCell.setLayout(new GridLayout()); 
    Button b = new Button(btnCell, SWT.PUSH); 
    b.setText("Change"); 
    b.addListener(SWT.MouseDown, new Listener() { 
     public void handleEvent(Event e) { 
      changeText(); 
     } 
    }); 

आप देख सकते हैं, मैं समग्र पर पुनः बनाने मैं एक नए तत्व जोड़े जाने के बाद बोल रहा हूँ है। साथ ही, मैंने सत्यापित किया है कि निपटने के लिए कॉल के बाद, testCell.getChildren() लंबाई की उम्मीद 0, जैसा कि अपेक्षित है, और जब मैं एक नया लेबल बनाता हूं, तो मुझे वही अभिव्यक्ति मिलती है जो 1 लौटने के लिए होती है, यह सत्यापित करते हुए कि नया तत्व वास्तव में हो रहा है अपने माता-पिता समग्र कंटेनर में जोड़ा गया क्या मुझे यहां कुछ याद आ रही है?

उत्तर

22

changeText() समारोह में,

testCell.redraw();

लाइन

testCell.layout();

द्वारा प्रतिस्थापित किया जाना चाहिए या, यदि आप मैं आकार बदलने के लिए चाहते हैं टी सही ढंग से आपको

shell.layout(); का उपयोग करना चाहिए।

+2

इस विषय को पुनर्जीवित करने के लिए क्षमा करें, लेकिन मैं हाल ही में इसी तरह की समस्या का समाधान और इस विषय के लिए मांग कर रहा था मैं 'shell.pack)' उपयोग करने के लिए (क्योंकि 'shell.layout था एक बहुत, लेकिन मेरी विंडो का आकार बदलने में मदद की() 'कुछ भी नहीं किया। हो सकता है कि यह किसी के लिए सहायक होगा। :) – mykola

+0

@mykola: 'shell.pack() 'ने मेरी खिड़की को छोटा बनाया और इसे फिर से खींचा, लेकिन' shell.layout() 'ने इसे दोबारा हटा दिया और उसका आकार रखा। मैं 'shell.open()' के बाद एक विंडो में नियंत्रण जोड़ रहा था और नियंत्रण दिखाई नहीं दे रहे थे। 'shell.layout() 'इसे हल किया। – gregn3

+0

लेआउट() पर जावाडोक को देखते हुए, 'testCell.requestLayout();' बेहतर भी होगा – titou10

-5

मैं कहूंगा कि लेबल पर चयन लिस्टर जोड़ें।

.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(final SelectionEvent e) { 
     //Change text by Label.setText(); 
    } 
} 
संबंधित मुद्दे