2016-07-21 3 views
0

ein JLabel I'created, die "Texta", wenn der variable Zählwert == -1,
"Text B", wenn der variable Zählwert == 0 und "TextC", wenn der variable Zählwert == 1.Ist es möglich, dass ein JLabel seinen Text abhängig von einem Variablenwert ändert?

angezeigt werden sollen

ich habe Schaukel verwendet meine Schnittstelle zu erstellen, die Sie unter

TempConverter

enter image description here

das rote Rechteck zeigt sehen kann, wo die JLabel sein sollte.

habe ich versucht, die Schaffung 3 JLabels und Ändern des setVisible (Boolean) immer dann, wenn der variable Zählwert Bedingung gilt. Das hat nicht funktioniert, weil ich die folgende Fehlermeldung anzeigt:

Exception in thread "main" java.lang.NullPointerException bei tempconverterUI.TempConverter.main (TempConverter.java:354) C: \ Benutzer \ x \ AppData \ Lokale \ NetBeans \ Cache \ 8.1 \ Executor-Snippets \ run.xml: 53: Java zurückgegeben: 1

Und die JLabels konnten nicht an der gleichen Stelle in der GUI platziert werden (Überlappung war nicht möglich).

Ich habe mit jLabel.setText versucht(), um den Text im JLabel angezeigt zu ändern, sobald die Variable Bedingung angewandt. Ich habe einen ähnlichen Fehler wie oben (wenn nicht gleich).

Ich habe einige andere Beiträge gelesen und recherchiert weiter und festgestellt, dass einige Leute vorgeschlagen, ActionListeners gesetzt werden, aber ich bin mir nicht sicher, dass diese mit einer einfachen Variablen, im Gegensatz zu einer Komponente in der GUI arbeiten wird.

My-Code ist wie folgt:

package tempconverterUI; 

import javax.swing.JOptionPane; 
import messageBoxes.UserData; 
import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.WString; 

public class TempConverter extends javax.swing.JFrame { 

public interface someLib extends Library 
{ 
     public int engStart(); 
     public int endStop(); 
     public int engCount(); 
     public WString engGetLastError(); 
     public int engSetAttribute(WString aszAttributeID, WString aszValue); 

} 

/** 
* Creates new form TempConverter 
*/ 
public TempConverter() { 
    initComponents(); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

Das Layout hier erstellt wird, gefolgt von der Temperatur convertion Methoden und unabhängige Komponente Funktionalität (was ich glaube nicht relevant ist in diesem Fall)

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 

/**This is where the Login form gets created*/    
    UserData.popUp(); 

/**After this the Library functions are called, which will return the variable count value*/  
    someLib lib = (someLib) Native.loadLibrary("someLib", someLib.class); 

    int startResult = lib.engStart(); 
    System.out.println(startResult); 
    if (startResult < 0) 
    { 
     System.out.println(lib.engGetLastError()); 
    } 

    System.out.println(UserData.getAcInput()); 
    int setAtResult = lib.engSetAttribute(new WString("CODE"), UserData.getAcInput()); 
    System.out.println(setAtResult); 
    if (setAtResult < 0) 
    { 
     System.out.println(lib.engGetLastError()); 
    } 

Und als nächstes ist das Stück Code von wo aus ich den JLabel Text zur Anzeige

int count = lib.engCount(); 
    System.out.println(count); 
    if (count == -1) 
    { 
     System.out.println(lib.engGetLastError()); 

    } 
    else if (count == 0) 
    { 

    } 
    else 
    { 

    } 

    new TempConverter().setVisible(true); 
} 

// Variables declaration - do not modify      
private javax.swing.JPanel bottomPanel; 
private javax.swing.JButton convertButton; 
private static javax.swing.JButton button; 
private javax.swing.JTextField from; 
private javax.swing.JComboBox<String> fromCombo; 
private javax.swing.JLabel fromLabel; 
private javax.swing.JLabel title; 
private javax.swing.JTextField to; 
private javax.swing.JComboBox<String> toCombo; 
private javax.swing.JLabel toLabel; 
private javax.swing.JPanel topPanel; 
// End of variables declaration     
steuern soll

}

Alle mit dieser Hilfe wäre sehr geschätzt. Wenn Sie auch ein einfaches Codebeispiel hinzufügen könnten, wäre das fantastisch, da ich neu in Java bin (und im Allgemeinen Programmierung).

+0

1) Siehe [Erkennung/Behebung für die hängende Schließklammer eines Codeblocks] (http://meta.stackexchange.com/q/251795/155831) für ein Problem, bei dem ich nicht mehr gestört werden konnte. 2) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. –

+0

http://stackoverflow.com/questions/15433855/how-to-create-change-listener-for-variable – xenteros

+1

Warum auf der Erde würde eine Temperaturumwandlung UI Klassen aus dem 'com.sun.jna'-Paket benötigen? –

Antwort

2

Probleme:

  1. Sie setzen die JLabel nicht sichtbar, sondern sie fügen Sie zunächst auf die GUI, lassen Sie es standardmäßig sichtbar, und legen Sie einfach den Text über setText(...).
  2. Geben Sie die Klasse, die die JLabel öffentlichen Methoden hält, die außerhalb Klassen die Möglichkeit, erlauben die Beschriftung der Text zu setzen. So etwas wie public void setLabelText(String text), und in der Methode Anruf setText(text) auf dem JLabel.
  3. Debug Ihre Nullpointer als würden Sie andere NPE - am stacktrace, so finden die Zeile, die sie wirft, und dann in den Code zurückblicken, um zu sehen, warum eine wichtige Variable in dieser Zeile null ist.
  4. Wann und wie Sie das JLabel ändern, hängt davon ab, auf welches Ereignis Sie achten möchten. Wenn es sich um Benutzereingaben handelt, möchten Sie auf diese Eingabe antworten, sei es ein ActionListener, der einer JButton oder einem JTextField hinzugefügt wurde, oder ein itemListener, der einem JRadioButton hinzugefügt wurde.
  5. Wenn Sie stattdessen auf die Änderung des Status einer Variablen warten möchten, unabhängig davon, wie die Variable geändert wird, erstellen Sie eine "gebundene Eigenschaft" (tutorial) mit PropertyChangeSupport und einem PropertyChangeListener.

Ein Beispiel des letzteren:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.*; 
import javax.swing.event.SwingPropertyChangeSupport; 

@SuppressWarnings("serial") 
public class ShowCount extends JPanel { 
    private static final int TIMER_DELAY = 1000; 
    private JLabel countLabel = new JLabel("     "); 
    private CountModel model = new CountModel(); 

    public ShowCount() { 
     model.addPropertyChangeListener(CountModel.COUNT, new ModelListener(this)); 

     setPreferredSize(new Dimension(250, 50)); 
     add(new JLabel("Count:")); 
     add(countLabel); 

     Timer timer = new Timer(TIMER_DELAY, new TimerListener(model)); 
     timer.start(); 
    } 

    public void setCountLabelText(String text) { 
     countLabel.setText(text); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     ShowCount mainPanel = new ShowCount(); 
     JFrame frame = new JFrame("ShowCount"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

class CountModel { 
    public static final String COUNT = "count"; // for count "property" 

    // support object that will notify listeners of change 
    private SwingPropertyChangeSupport support = new SwingPropertyChangeSupport(this); 
    private int count = 0; 

    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     int oldValue = this.count; 
     int newValue = count; 
     this.count = count; 

     // notify listeners that count has changed 
     support.firePropertyChange(COUNT, oldValue, newValue); 
    } 

    // two methods to allow listeners to register with support object 
    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     support.addPropertyChangeListener(listener); 
    } 

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { 
     support.addPropertyChangeListener(propertyName, listener); 
    } 

} 

class ModelListener implements PropertyChangeListener { 
    private ShowCount showCount; 

    public ModelListener(ShowCount showCount) { 
     super(); 
     this.showCount = showCount; 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     int newValue = (int) evt.getNewValue(); 
     showCount.setCountLabelText(String.format("%03d", newValue)); 
    } 
} 

class TimerListener implements ActionListener { 
    private CountModel model; 

    public TimerListener(CountModel model) { 
     super(); 
     this.model = model; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     int oldCount = model.getCount(); 
     int newCount = oldCount + 1; 
     model.setCount(newCount); 
    } 
} 
Verwandte Themen