Java: Countdown und Timer (am Beispiel von Swing)

Posted: Dezember 21st, 2012 | Filed under: Java, Programmieren | Tags: , , , , , , | 1 Comment »

Häufig benötigt man für Applikationen einen Zeitnehmer, oder es soll ein bestimmtes Event nach einer gewissen Zeit ausgeführt werden. Mit Hilfe der Klasse Timer aus der Swing-Bibliothek kann ein sogenannter Countdown leicht erstellt werden. Das folgende Beispiel veranschaulicht die Realisierung eines Countdowns.

Screenshot

image

Quellcode

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.WindowConstants;


public class Countdown extends JFrame {
 
  // Countdown mit 42 Sekunden
  public static int counterValue = 42;
  public static Timer timer;
  public static JLabel label;
 
  public Countdown() {
    initGUI();
  }
 
  // GUI-Erzeugen
  private void initGUI(){
    BorderLayout thisLayout = new BorderLayout();
    this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    this.getContentPane().setLayout(thisLayout);
    label = new JLabel();
    label.setText(String.valueOf(counterValue));
    this.getContentPane().add(label, BorderLayout.CENTER);
    this.setTitle("Countdown Example");
      this.pack();
      this.setVisible(true);
  }
 

  public static void main(String[] args) {
    // GUI erzeugen
    Countdown countdown = new Countdown();
   
    // Timer erzeugen, jede 1000 Millisekunden (= 1 Sekunde)
    // Methode actionPerformed aufrufen.
    Countdown.timer = new Timer(1000, new ActionListener() {
     
      public void actionPerformed(ActionEvent e) {
        // 1 Sekunde abziehen
        Countdown.counterValue--;
       
        // Zahl in Label darstellen
        Countdown.label.setText(String.valueOf(counterValue));
       
        // Falls Zähler = 0, Countdown abgelaufen!
        if(Countdown.counterValue == 0){
          System.out.println("Counterdown ausgelaufen!");
         
          // Timer stoppen
          Countdown.timer.stop();
        }
      }
    });
       
    // Timer starten
    timer.start();
  }
}

In der Klasse Timer kann im Konstruktor ein Zeitwert und ein Listener übergeben werden. Die actionPerformed-Methode dieses Listeners wird, nachdem der Timer gestartet wurde, alle 1000 ms (=1 s), aufgerufen. Die Methode actionPerfomed ist also unser Taktgeber beim Abziehen einer Sekunde von der aktuellen Countdown-Zahl. Erreicht unsere Zahl den Wert 0, ist der Countdown schließlich abgelaufen.


Java JButton und ActionListener

Posted: Mai 16th, 2012 | Filed under: Allgemein, Java, Programmieren, Tutorials | Tags: , , , , , , , | No Comments »

Hier ein kleines Beispiel für alle Java Swing Neulinge. Mit Hilfe eines ActionListeners könnt ihr Klicks auf einen JButton abfangen. Funktioniert natürlich auch, falls ihr die Schaltfläche mit der Tastatur auslöst (zum Beispiel bei Focus mit Hilfe der Leertaste).

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JButtonExample implements ActionListener{
    
    private JButton button;

    public JButtonExample() {
        // Fenster anlegen
        JFrame frame = new JFrame();
        frame.setTitle("JButton Example");
        frame.setLayout(new BorderLayout());
        
        // Button anlegen
        this.button = new JButton("OK");

        // Eventhandler für Button zuweisen
        this.button.addActionListener(this);
        
        // Button der Frame hinzufügen
        frame.add(this.button);
        
        // Fenster zentrieren
        frame.setSize(350,150);
        frame.setLocationRelativeTo(null);
        
        // Fenster sichbar machen
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new JButtonExample();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(button == e.getSource()){
            System.out.println("Button wurde geklickt!");
        }
    }
}

Ich hoffe ich konnte dem ein oder anderen mit diesem Tutorial helfen =)


Java Chat Tutorial

Posted: Juni 21st, 2011 | Filed under: Java, Programmieren | Tags: , , , , , , , , , , | No Comments »

imageAls ich meinen Netzwerk-Chat jLanChat programmiert habe, musste ich mich intensiv mit diesem Thema beschäftigen. Herkömmlicherweise verwendet man zum versenden von Nachrichten das sogenannte Client-Server Prinzip. Will zum Beispiel PC1 eine Nachricht an PC2 senden so muss PC2 einen Socket öffnen mit dem sich PC1 dann verbindet und über diesen Socket die Nachricht sendet. Will man nun eine Nachrichtenleitung mit mehren PCs aufbauen so benötigt man schnell einen Server, mit dem sich dann alle Clients verbinden und über diesen dann kommunizieren.

Wenn wir die Kommunikation über Multicast (Punkt zu Gruppe) tätigen brauchen wir keinen Server. Denn fast alle Router/Switches unterstützen Multicast.

Alle Teilnehmer verbinden sich mit dem Switch/Router und treten einer Gruppe, in Form einer IP-Adresse und eines Ports (z.B.: 230.0.0.1:4447), bei. Bekommt der Switch/Router jetzt eine Nachricht eines Clients mit der Gruppen-Adresse als Zieladresse vervielfältigt der Switch/Router diese Nachricht und sendet sie an alle die der Gruppe beigetreten sind, auch an den der die Nachricht abgesendet hat. So kann man zum Beispiel einen serverlosen Chat aufbauen. Wenn man’s genau nimmt übernimmt der Switch/Router jetzt unsere Serverfunktion.

Um das Ganze in JAVA zu realisieren muss man folgende Bibliothek ins Projekt einbinden: http://commons.apache.org/lang/

Hier unser Beispiel, Es gibt eine Sender-Klasse und eine Empfänger-Klasse:

Sender

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;


public class Sender {

  public static void main(String[] args) {
    // Netzwerk-Gruppe
    String NETWORK_GROUP = "230.0.0.1";
    // Netzwerk-Gruppen Port
    int NETWORK_GROUP_PORT = 4447;
    // Client-Port
    int CLIENT_MULTICAST_PORT = 4446;
   
    // Nachrichten-Codierung
    String TEXT_ENCODING = "UTF8";
   
    try {
      MulticastSocket socket =  new MulticastSocket(CLIENT_MULTICAST_PORT);
      byte[] message = "Hallo Welt".getBytes(TEXT_ENCODING);
     
      // Nachricht an Gruppe senden
      socket.send(new DatagramPacket(message, message.length , InetAddress.getByName(NETWORK_GROUP) ,
NETWORK_GROUP_PORT
));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 

Empfänger

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;


public class Receiver {

  public static void main(String[] args) {
    // Netzwerk-Gruppe
    String NETWORK_GROUP = "230.0.0.1";
    // Netzwerk-Gruppen Port
    int NETWORK_GROUP_PORT = 4447;
   
    // Nachrichten-Codierung
    String TEXT_ENCODING = "UTF8";
   
    InetAddress group;
    MulticastSocket socket;
 
    try {
      // Gruppe anlegen
      group = InetAddress.getByName(NETWORK_GROUP);
      socket = new MulticastSocket(NETWORK_GROUP_PORT);
     
      // Gruppe beitreten
      socket.joinGroup(group);
     
      byte[] bytes = new byte[65536];
      DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
     
      while(true){
        // Warten auf Nachricht
        socket.receive(packet);
        String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING);
        System.out.println(message);
      }   
     
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

 

Ich hoffe ich konnte dem ein oder anderen damit helfen.

Das ganze könnt ihr euch als Eclipse Projekt hier herunterladen (inklusive Bibliotheken): Eclipse Projekt – Tutorial Net Send


PHP: Weiterleitung

Posted: Mai 13th, 2011 | Filed under: Programmieren | Tags: , , , , , | No Comments »

Oft braucht man bei einer PHP-Webanwendungen Weiterleitungen, zum Beispiel bei einem Login-System.

Hier das Codebeispiel:

Header("Location: login.php");

Java Checkbox in JList

Posted: November 3rd, 2010 | Filed under: Programmieren | Tags: , , , , , , , , , | 6 Comments »

Für mein neustes Programm jCalFilter, welches Einträge in einem Kalender im ICS-Format filtern kann, habe ich eine JList gebraucht in der ich Termine auswählen kann. Dafür eignete sich am Besten eine JList die JCheckboxes beinhaltet. Mit diesem kleinen Tutorial möchte ich euch zeugen wie ihr das realisieren könnt.

Das fertige Programm soll so aussehen:

image

Als Datenkapsel verwende ich ein Objekt Person welches lediglich die Informationen Vorname, Name und Alter abspeichert. Des weiteren bietet die Klasse Person noch eine toString()-Methode. In dieser wird der Text zurückgegeben der jeweils in der Liste angezeigt werden soll.

Person.java

public class Person {

  private String name;
  private String vorname;
  private int alter;
 
  public Person(String name, String vorname, int alter){
    this.name = name;
    this.vorname = vorname;
    this.alter = alter;
  }
 
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getVorname() {
    return vorname;
  }
  public void setVorname(String vorname) {
    this.vorname = vorname;
  }
  public int getAlter() {
    return alter;
  }
  public void setAlter(int alter) {
    this.alter = alter;
  }
 
  @Override
  public String toString() {
    return vorname + " " + name + " (" + alter + ")";
  }
}

 

Nun kommen wir zum eigentlichen Kern der Implementierung. Die Klasse JCheckBoxList erbt einfach von JList. Diese beinhaltet einen ListCellRenderer in dem Formatierungen verändert werden können. Zusätzlich bietet die Klasse JCheckBoxList eine Methode selectAll() und deselectAll() an, um eben alle Häkchen zu setzten oder um die Auswahl aller Häkchen zu entfernen.

JCheckBoxList.java

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;

public class JCheckBoxList extends JList {

  public JCheckBoxList() {
    setCellRenderer(new CellRenderer());
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        int index = locationToIndex(e.getPoint());
        if (index != -1) {
          JCheckBox checkbox = (JCheckBox) getModel().getElementAt(
              index);
          checkbox.setSelected(!checkbox.isSelected());
          repaint();
        }
      }
    });
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  protected class CellRenderer implements ListCellRenderer {
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
      JCheckBox checkbox = (JCheckBox) value;

      if (isSelected) {
        // checkbox.setBorderPainted(true);
        // checkbox.setForeground(UIManager.getColor("List.selectionForeground"));
        // checkbox.setBackground(UIManager.getColor("List.selectionBackground"));
      } else {
        // checkbox.setBorderPainted(false);
        // checkbox.setForeground(UIManager.getColor("List.foreground"));
        checkbox.setBackground(UIManager.getColor("List.background"));
      }
      return checkbox;
    }
  }

  public void selectAll() {
    int size = this.getModel().getSize();
    for (int i = 0; i < size; i++) {
      JCheckBox checkbox = (JCheckboxWithObject) this.getModel()
          .getElementAt(i);
      checkbox.setSelected(true);
    }
    this.repaint();
  }

  public void deselectAll() {
    int size = this.getModel().getSize();
    for (int i = 0; i < size; i++) {
      JCheckBox checkbox = (JCheckboxWithObject) this.getModel()
          .getElementAt(i);
      checkbox.setSelected(false);
    }
    this.repaint();
  }
}

 

Um die Verbindung zwischen einer Person und der Checkbox herzustellen habe ich das Objekt JCheckboxWithObject erstellt. Diese Klasse erbt von JCheckBox aber beinhaltet zusätzlich noch ein Objekt vom Typ Object in dem man irgendein Objekt ablegen kann. In unserem Fall ein Objekt vom Typ Person. Die Checkbox wird, im Konstruktor und der Setter-Methode, nun mit dem Rückgabestring der toString()-Methode des jeweiligen Objektes(Person) beschriftet.

JCheckboxWithObject.java

import javax.swing.JCheckBox;

public class JCheckboxWithObject extends JCheckBox{
 
  private Object object;
 
  public JCheckboxWithObject (Object object){
    this.object = object;
    this.setText(object.toString());
  }
 
  public Object getObject() {
    return object;
  }

  public void setObject(Object object) {
    this.object = object;
    this.setText(object.toString());
  }
}

 

Nun kann die Datenstruktur wie folgt angewendet werden. Das Ergebnis seht ihr ja oben.

Main.java

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Main {

  {
    // Set Look & Feel
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        // Fenster
        JFrame frame = new JFrame();

        // Checkboxliste
        DefaultListModel personenListModel = new DefaultListModel();
        JCheckBoxList list = new JCheckBoxList();
        list.setModel(personenListModel);

        // Daten hinzufügen
        Person hans = new Person("Wurst", "Hans", 24);
        Person peter = new Person("Müller", "Peter", 36);
        Person klaus = new Person("Wagner", "Klaus", 29);
        JCheckboxWithObject hansCheckbox = new JCheckboxWithObject(hans);
        JCheckboxWithObject peterCheckbox = new JCheckboxWithObject(
            peter);
        JCheckboxWithObject klausCheckbox = new JCheckboxWithObject(
            klaus);

        personenListModel.addElement(hansCheckbox);
        personenListModel.addElement(peterCheckbox);
        personenListModel.addElement(klausCheckbox);

        frame.getContentPane().add(list);
        frame.setVisible(true);
        frame.setTitle("JCheckbox in JList");
        frame.setSize(200, 200);
      }
    });
  }
}

Download

Hier könnt ihr euch denn ganzen Quellcode herunterladen.


Pages: 1 2 Nächste Seite