Och här Java-koden, trådstyrt så inte GUI fryser...
Kod: Markera allt
package start;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JPanel;
import java.awt.GridLayout;
import javax.swing.SwingConstants;
import serial.AppWinSerial;
import threadController.AppWinThreadController;
import javax.swing.UIManager;
import java.awt.Button;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.CaretEvent;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.SystemColor;
import javax.swing.JLabel;
public class AppWinLCD {
	private static final int DEFAULTBAUDRATE = 19200;
	private static AppWinThreadController threadController;
	private static Thread threadControllerThread;
	private static AppWinSerial appwinSerial;
	private JFrame frmIclcdapplication;
	private static JTextField[] textField = new JTextField[32];	
	private Button button_1;
	private Button button_2;
	private Button button_3;
	private Button button_4;	
	private JPanel panel_1;
	private JPanel panel_1_1;
	private JPanel panel_2;
	private JPanel panel_2_1;
	private JTextField textField_1;
	private JTextField textField_2;
	private Label label_1;
	private Label label_2;
	private boolean changeTextFlag;
	private boolean eraseTextFlag;
	private static void setUpSerial() {
		appwinSerial = new AppWinSerial();
		appwinSerial.setBaudRate(AppWinLCD.DEFAULTBAUDRATE);		// default baudrate för kommunikation med Arduino
	}
	public static AppWinSerial getAppWinSerial() {
		return appwinSerial;
	}
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					AppWinLCD window = new AppWinLCD();
					window.frmIclcdapplication.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	/**
	 * Create the application.
	 */
	public AppWinLCD() {
		AppWinLCD.setUpSerial();
		initialize();			
		AppWinLCD.scanLCDJTextField();
	}
	
	// Diverse metoder ====================================================================================================================
	private void setChangeTextFlag(boolean value) {
		changeTextFlag = value;
	}
	private boolean getChangeTextFlag() {
		return changeTextFlag;
	}
	private void setEraseTextFlag(boolean value) {
		eraseTextFlag = value;
	}
	private boolean getEraseTextFlag() {
		return eraseTextFlag;
	}
	private void showNumberOfCharRow_1() {		
		int length = this.textField_1.getText().length();
		if(length < 16)
			this.label_1.setText(String.valueOf(length));
		if((length >= 16) && (length < 17) )
			this.label_1.setText("Max!");
		if(length >= 17)
			this.label_1.setText("Radera!");
	}
	private void showNumberOfCharRow_2() {
		int length = this.textField_2.getText().length();
		System.out.println("this.textField_2.getText().length() " + length);
		if(length < 16)
			this.label_2.setText(String.valueOf(length));
		if((length >= 16) && (length < 17) )
			this.label_2.setText("Max!");
		if(length >= 17)
			this.label_2.setText("Radera!");
	}
	/*
	 * Hanterar editeringen av texten så de 32 blå rutorna  fylls i korrekt
	 */
	private void setJTextFieldCharactersRow_1(int caretPosition, boolean changeTextFlag, boolean eraseTextFlag) {
		if(changeTextFlag == true) {
			
			int length = textField_1.getText().length();
			for(int index = 0;index < 16;index++) {							// rensa 
				textField[index].setText(" ");
			}
			length = textField_1.getText().length();						// hämta in text på nytt
			if(length > 16)
				length = 16;
			
			for(int index = 0;index < length;index++) {
				char value = textField_1.getText().charAt(index);
				String str =String.valueOf(value);
				textField[index].setText(str);
			}			
		}
		
		if(eraseTextFlag == true) {											// raderat tecken 
			int length = textField_1.getText().length();				
			for(int index = 0;index < 16;index++) {							// rensa 
				textField[index].setText(" ");
			}
			length = textField_1.getText().length();						// hämta in text på nytt
			if(length > 16)
				length = 16;
			for(int index = 0;index < length ;index++) {
				char value = textField_1.getText().charAt(index);
				String str =String.valueOf(value);
				textField[index].setText(str);
			}
		}		
	}
	private void setJTextFieldCharactersRow_2(int caretPosition, boolean changeTextFlag, boolean eraseTextFlag) {
		
		if(changeTextFlag == true) {
			
			int length = textField_2.getText().length();
			for(int index = 16;index < 32;index++) {							// rensa 
				textField[index].setText(" ");
			}
			length = textField_2.getText().length();						// hämta in text på nytt
			if(length > 16)
				length = 16;
			
			for(int index = 0;index < length;index++) {
				char value = textField_2.getText().charAt(index);
				String str =String.valueOf(value);
				textField[index+16].setText(str);
			}			
		}
		
		if(eraseTextFlag == true) {											// raderat tecken 
			int length = textField_2.getText().length();				
			for(int index = 16;index < 32;index++) {							// rensa 
				textField[index].setText(" ");
			}
			length = textField_2.getText().length();						// hämta in text på nytt
			if(length > 16)
				length = 16;
			for(int index = 0;index < length ;index++) {
				char value = textField_2.getText().charAt(index);
				String str =String.valueOf(value);
				textField[index+16].setText(str);
			}
		}		
	}
	public static void scanLCDJTextField() {	
		char sign = 0;
		for(int index = 0; index <= 31; index++) {
			if(textField[index].getText().isEmpty())
				textField[index].setText(" ");			
			sign = textField[index].getText().charAt(0);
			appwinSerial.loadLcdText((byte) sign, index);
			System.out.print((char)sign + ", ");
		}	
		System.out.println();
	}
	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frmIclcdapplication = new JFrame();
		frmIclcdapplication.getContentPane().setBackground(new Color(253, 245, 230));
		frmIclcdapplication.setTitle("I2C_LCD_Application");
		frmIclcdapplication.setBounds(100, 100, 663, 468);
		frmIclcdapplication.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmIclcdapplication.getContentPane().setLayout(null);
		panel_1 = new JPanel();
		panel_1.setForeground(new Color(0, 0, 0));
		panel_1.setBorder(null);
		panel_1.setBackground(new Color(0, 66, 164));
		panel_1.setBounds(60, 96, 520, 45);
		frmIclcdapplication.getContentPane().add(panel_1);
		panel_1.setLayout(new GridLayout(1, 0, 0, 0));
		panel_2 = new JPanel();
		panel_2 = new JPanel();
		panel_2.setBackground(new Color(0, 66, 164));
		panel_2.setBounds(60, 147, 520, 45);
		frmIclcdapplication.getContentPane().add(panel_2);
		panel_2.setLayout(new GridLayout(1, 0, 0, 0));
		//========================================================================== 1:a raden med 16 blå textFields	
		for(int index=0;index<=15;index++) {
			textField[index] = new JTextField(1);
			textField[index].setHorizontalAlignment(SwingConstants.CENTER);			
			textField[index].setBackground(new Color(0, 82, 164));
			textField[index].setForeground(new Color(255, 255, 255));
			textField[index].setFont(new Font("Tahoma", Font.PLAIN, 30));
			textField[index].setColumns(1);
			textField[index].setText(" ");
			textField[index].setEditable(false);
			panel_1.add(textField[index]);
		}
		//========================================================================== 2:a raden med 16 blå textFields	
		for(int index=16;index<=31;index++) {
			textField[index] = new JTextField(1);
			textField[index].setHorizontalAlignment(SwingConstants.CENTER);			
			textField[index].setBackground(new Color(0, 82, 164));
			textField[index].setForeground(new Color(255, 255, 255));
			textField[index].setFont(new Font("Tahoma", Font.PLAIN, 30));
			textField[index].setColumns(1);
			textField[index].setText(" ");
			textField[index].setEditable(false);
			panel_2.add(textField[index]);
		}
		//========================================================================== START-knapp
		button_1 = new Button("START");		
		button_1.setForeground(new Color(127, 255, 0));
		button_1.setBackground(new Color(46, 139, 87));
		button_1.addMouseListener(new java.awt.event.MouseAdapter() {
			@Override
			public void mouseClicked(java.awt.event.MouseEvent e) {
				if(threadController == null) {					
					threadController = new AppWinThreadController();			// skapa en trådkontroller					
					threadControllerThread = new Thread(threadController);		// låt trådkontrollern bli en tråd					
					try {
						threadControllerThread.start();							// starta upp Seriekommunikationen
					}
					catch(IllegalThreadStateException itse) {
						System.out.println("IllegalThreadStateException");
					}										
				}								
			}
		});
		button_1.setFont(new Font("Monospaced", Font.BOLD, 28));
		button_1.setBounds(524, 326, 113, 45);
		frmIclcdapplication.getContentPane().add(button_1);
		//========================================================================== SEND-knapp
		button_4 = new Button("SEND TEXT TO LCD");
		button_4.setBackground(new Color(255, 250, 205));
		button_4.addMouseListener(new java.awt.event.MouseAdapter() {
			@Override
			public void mouseClicked(java.awt.event.MouseEvent e) {
				if(threadController != null) {
					appwinSerial.setSend_Row_1_Flag(true);						// utför avbrott för att sända data till rad 1 och sedan rad 2
					appwinSerial.setSend_Row_2_Flag(true);
					try {											
						threadControllerThread.interrupt();						// trådavbrott för att utföra kommando		
					}
					catch(SecurityException se) {
						se.printStackTrace();
					}				
				}
			}
		});	
		button_4.setFont(new Font("Monospaced", Font.PLAIN, 28));
		button_4.setBounds(10, 326, 302, 45);
		frmIclcdapplication.getContentPane().add(button_4);
		//========================================================================== CLEAR LCD-knapp
		button_3 = new Button("CLEAR LCD");
		button_3.setBackground(new Color(255, 250, 205));
		button_3.addMouseListener(new java.awt.event.MouseAdapter() {
			@Override
			public void mouseClicked(java.awt.event.MouseEvent e) {
				if(threadController != null) {					
					appwinSerial.setClearLCDFlag(true);							// flagga att ett CLEAR-kommando ska utföras
					try {
						threadControllerThread.interrupt();						// trådavbrott för att utföra kommando
					}
					catch(SecurityException se) {
						se.printStackTrace();
					}
				}	
			}
		});
		button_3.setFont(new Font("Monospaced", Font.PLAIN, 28));
		button_3.setBounds(10, 377, 183, 45);
		frmIclcdapplication.getContentPane().add(button_3);
		//========================================================================== EXIT-knapp
		button_2 = new Button("EXIT");
		button_2.setForeground(new Color(127, 255, 0));
		button_2.setBackground(new Color(46, 139, 87));
		button_2.addMouseListener(new java.awt.event.MouseAdapter() {
			@Override
			public void mouseClicked(java.awt.event.MouseEvent e) {	
				if (threadControllerThread != null) {
					appwinSerial.setStopSignal();								// flagga att kommunikationen med Arduino ska avslutas
					try {
						threadControllerThread.interrupt();						// avsluta Seriekommunikationen
					}
					catch(SecurityException se) {
						se.printStackTrace();
					}
				}
				System.exit(0);
			}			
		});
		button_2.setFont(new Font("Monospaced", Font.BOLD, 28));
		button_2.setBounds(524, 377, 113, 45);
		frmIclcdapplication.getContentPane().add(button_2);
		panel_1_1 = new JPanel();
		panel_1_1.setBackground(new Color(250, 240, 230));
		FlowLayout flowLayout = (FlowLayout) panel_1_1.getLayout();
		flowLayout.setAlignment(FlowLayout.RIGHT);
		panel_1_1.setBounds(10, 203, 627, 53);
		frmIclcdapplication.getContentPane().add(panel_1_1);
		
		
		panel_2_1 = new JPanel();
		panel_2_1.setBackground(new Color(250, 240, 230));
		FlowLayout flowLayout_1 = (FlowLayout) panel_2_1.getLayout();
		flowLayout_1.setAlignment(FlowLayout.RIGHT);
		panel_2_1.setBounds(10, 267, 627, 53);
		frmIclcdapplication.getContentPane().add(panel_2_1);
		
		
		/*
		 * Textfält att skriva in första raden
		 */
		textField_1 = new JTextField();
		textField_1.getDocument().addDocumentListener(new DocumentListener() {
			@Override
			public void insertUpdate(DocumentEvent e) {
				System.out.println("Ändra");
				setChangeTextFlag(true);
			}
 
			@Override
			public void removeUpdate(DocumentEvent e) {
				System.out.println("Radera");
				setEraseTextFlag(true);
			}
			@Override
			public void changedUpdate(DocumentEvent e) {
				System.out.println("Övrigt");
			}
		});
		textField_1.addCaretListener(new CaretListener() {
			public void caretUpdate(CaretEvent e) {	
				
				System.out.println("changeTextFlag = " + getChangeTextFlag());
				System.out.println("eraseTextFlag = " + getEraseTextFlag());				
				int caretPosition = textField_1.getCaretPosition();
				System.out.println("caretUpdate_1 caretPosition = " + caretPosition);
				showNumberOfCharRow_1();												// uppdatera JLabel 
				setJTextFieldCharactersRow_1(caretPosition, changeTextFlag, eraseTextFlag);
				setChangeTextFlag(false);
				setEraseTextFlag(false);
			}
		});
		textField_1.setFont(new Font("Tahloma", Font.PLAIN, 30));
		textField_1.setColumns(16);
		panel_1_1.add(textField_1);
		
		label_1 = new Label("R\u00E4knare");
		label_1.setFont(new Font("Times New Roman", Font.PLAIN, 25));
		label_1.setAlignment(Label.CENTER);
		panel_1_1.add(label_1);
		/*
		 * Textfält att skriva in andra raden
		 */
		textField_2 = new JTextField();
		textField_2.getDocument().addDocumentListener(new DocumentListener() {
			@Override
			public void insertUpdate(DocumentEvent e) {
				System.out.println("Ändra");
				setChangeTextFlag(true);
			}
 
			@Override
			public void removeUpdate(DocumentEvent e) {
				System.out.println("Radera");
				setEraseTextFlag(true);
			}
			@Override
			public void changedUpdate(DocumentEvent e) {
				System.out.println("Övrigt");
			}
		});
		textField_2.addCaretListener(new CaretListener() {
			public void caretUpdate(CaretEvent e) {	
				
				System.out.println("changeTextFlag = " + getChangeTextFlag());
				System.out.println("eraseTextFlag = " + getEraseTextFlag());				
				int caretPosition = textField_2.getCaretPosition();
				System.out.println("caretUpdate_2 caretPosition = " + caretPosition);
				showNumberOfCharRow_2();												// uppdatera JLabel 
				setJTextFieldCharactersRow_2(caretPosition, changeTextFlag, eraseTextFlag);
				setChangeTextFlag(false);
				setEraseTextFlag(false);
			}
		});
		textField_2.setFont(new Font("Tahoma", Font.PLAIN, 30));
		textField_2.setColumns(16);		
		panel_2_1.add(textField_2);
		label_2 = new Label("R\u00E4knare");
		label_2.setFont(new Font("Times New Roman", Font.PLAIN, 25));
		label_2.setAlignment(Label.CENTER);
		panel_2_1.add(label_2);
		
		JPanel panel = new JPanel();
		panel.setForeground(new Color(0, 0, 0));
		panel.setBackground(new Color(253, 245, 230));
		panel.setBounds(60, 18, 520, 38);
		frmIclcdapplication.getContentPane().add(panel);
		
		JLabel lblNewLabel = new JLabel("I2C LCD Test Software");
		panel.add(lblNewLabel);
		lblNewLabel.setForeground(new Color(0, 0, 139));
		lblNewLabel.setBackground(new Color(0, 0, 0));
		lblNewLabel.setFont(new Font("Ink Free", Font.BOLD | Font.ITALIC, 25));
		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
		
		JPanel panel_3 = new JPanel();
		panel_3.setForeground(Color.BLACK);
		panel_3.setBackground(new Color(165, 42, 42));
		panel_3.setBounds(60, 58, 520, 4);
		frmIclcdapplication.getContentPane().add(panel_3);
		
		JPanel panel_3_1 = new JPanel();
		panel_3_1.setForeground(Color.BLACK);
		panel_3_1.setBackground(new Color(165, 42, 42));
		panel_3_1.setBounds(60, 11, 520, 4);
		frmIclcdapplication.getContentPane().add(panel_3_1);
	}																			// end initialize()
}