2016-07-21 4 views
0

I'created в JLabel, который должен отображать "TextA", если переменная счетчика == -1,
"Текст B", если переменная счетчика == 0 и "TextC", если переменная счетчик == 1.Возможно ли изменение JLabel текста в зависимости от значения переменной?

Я использовал свинг, чтобы создать свой интерфейс, который вы можете увидеть ниже

TempConverter

enter image description here

красный прямоугольник показывает, где JLabel должно быть.

Я попытался создать 3 JLabels и изменить setVisible (Boolean), когда применяется условие значения переменной. Это не сработало, потому что я получил следующее сообщение об ошибке:

Исключение в потоке "главный" java.lang.NullPointerException в tempconverterUI.TempConverter.main (TempConverter.java:354) C: \ Users \ х \ AppData \ Local \ NetBeans \ Cache \ 8.1 \ executor-snippets \ run.xml: 53: Java возвращается: 1

И JLabels нельзя размещать в том же месте в графическом интерфейсе (перекрытие невозможно).

Я попытался использовать jLabel.setText(), чтобы изменить текст, отображаемый в JLabel, всякий раз, когда применяется условие переменной. Я получил аналогичную ошибку с предыдущей (если не то же самое).

Я прочитал несколько других сообщений и исследовал далее, и некоторые люди предложили установить ActionListeners, но я не уверен, что они будут работать с простой переменной, в отличие от компонента в графическом интерфейсе.

Мой код выглядит следующим образом:

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() { 

Макет создается здесь, а затем с помощью методов температуры Convertion и функциональности неродственных компонента (который я считаю не уместным в данном случае)

/** 
* @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()); 
    } 

И следующий фрагмент кода, из которого я должен управлять JLabel Текст для отображения

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     

}

Любая помощь с этим была бы высоко оценена. Если бы вы могли включить простой пример кода, это было бы фантастически, поскольку я новичок в Java (и вообще программировании).

+0

1) См. [Обнаружение/исправление для висячего закрывающего кронштейна кодового блока] (http://meta.stackexchange.com/q/251795/155831) для проблемы, которую я больше не мог беспокоить. 2) Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

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

+1

Почему на Земле пользовательские интерфейсы преобразования температуры нуждаются в классах из пакета 'com.sun.jna'? –

ответ

2

Вопросы:

  1. Не устанавливайте JLabel невидимо, добавьте его сначала в GUI, оставьте видимым по умолчанию, а просто установить его текст с помощью setText(...).
  2. Дайте классу, который содержит общедоступные методы JLabel, которые позволяют внешним классам устанавливать текст ярлыка. Что-то вроде public void setLabelText(String text), а в вызове метода setText(text) на JLabel.
  3. Отладка вашего NullPointerException, как и любой другой NPE, - посмотрите на стеке, найдите строку, которая его выбрасывает, а затем загляните в код, чтобы узнать, почему ключевая переменная в этой строке равна нулю.
  4. Когда и как вы меняете JLabel, это зависит от того, какое событие вы хотите прослушать. Если это пользовательский ввод, то вы захотите ответить на этот вход, будь то ActionListener, добавленный в JButton или JTextField, или itemListener, добавленный в JRadioButton.
  5. Если вы хотите прослушать изменение состояния переменной, независимо от того, как изменяется переменная, сделайте ее «связанным свойством» (tutorial) с помощью PropertyChangeSupport и PropertyChangeListener.

В качестве примера последнего:

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); 
    } 
} 
Смежные вопросы