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