2011-08-24 4 views
2

Je dois nettoyer mon labelResult à chaque fois sur textField Action, mais la première fois, il ajoute 'null' devant la chaîne, puis - imprime une nouvelle chaîne juste après. S'il vous plaît aider.Custom JLabel Cleanup

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 


public class Frame extends JFrame implements ActionListener { 
    boolean isDirect = true; 
    String[] typeStr = {"direct", "invert"}; 
    JLabel labelTip = new JLabel("Choose 'direct' OR 'invert' to print your next line in direct order or inverted respectively."); 
    JTextField textField = new JTextField("Some text!", 40); 
    JComboBox comboBox = new JComboBox(typeStr); 
    EventProcessing eventProcessing = new EventProcessing(); 
    JLabel labelResult = new JLabel(); 

    public Frame() { 
     setLayout(new BorderLayout()); 
     getContentPane().add(labelTip, BorderLayout.PAGE_START); 
     getContentPane().add(comboBox, BorderLayout.CENTER); 
     getContentPane().add(textField, BorderLayout.AFTER_LINE_ENDS); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     textField.addActionListener(this); 

     pack(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     getContentPane().remove(labelResult); 
     labelResult = new JLabel(); 
     labelResult.setText(""); 
     if (!(comboBox.getSelectedItem()).equals("direct")) { 
      isDirect = false; 
     } 
     else { 
      isDirect = true; 
     } 
     labelResult.setText(eventProcessing.action(isDirect, textField.getText())); 
     getContentPane().add(labelResult, BorderLayout.PAGE_END); 

     pack(); 

    } 
} 

Répondre

1

@ Tim Je sais que dans le tutoriel officiel à propos de JComboBox est utilisé ActionListener, mais pour l'une des actions de JComboBox à l'interface graphique est meilleur look pour ItemListener, il vous deux états (toujours appelé deux fois, mais vous pouvez filtrer entre Thes deux options sélectionnées/désélectionnées par wraping au if ... else)

et votre code ne devrait être que

Runnable doRun = new Runnable() { 

    @Override 
    public void run() { 
     labelResult.setText(eventProcessing.action(isDirect, textField.getText())); 
     add(labelResult, BorderLayout.PAGE_END); 
     //1) this.pack(); if you want to re-layout with effect to size of JFrame too 

     //2a revalidate(); 
     //2b plus in most cases 
     //2b repaint(); relayout Container with fitting JComponents inside Container, 
     //2b but without resize of JFrame 
    } 
}; 
SwingUtilities.invokeLater(doRun); 
0

Sans le code à EventProcessing.action() il est difficile de déterminer, mais je suppose que vous essayez de concaténer deux chaînes, dont la première est nulle. Les chaînes null sont converties en chaîne littérale "null".

+0

il devrait en créer un nouveau à chaque fois. – UnknitSplash

+0

* Quoi * devrait créer un nouveau * quoi * chaque fois? Chaque appel à 'eventProcessing.action()' devrait créer un nouveau 'String'? –

+0

chaque action sur textField – UnknitSplash