Archive for the ‘Programmierung’ Category

Kommentare deaktiviert

Java: GUI


2010
07.14

Ich verwende ja gern Funktionen um Objekte fertig initialisiert zu erstellen.
Daher hab ich als ich mich an GUIs gemacht hab als Erstes dafür eine Funktion geschrieben.

Der folgende Code erstellt ein Fenster mit angegebenem Titel und Ausmaßen.

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;

public static JFrame createFrame(String title, int width, int height){
  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  if (d.height < height || d.width < width)
    System.err.println("Window creation: Frame bigger than screen.");

  JFrame win = new JFrame(title);
  win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  win.setSize(width, height);
  win.setResizable(false);
  win.setLocationRelativeTo(null); // Show window centered

//  No title bar etc.
//  win.dispose();
//  win.setUndecorated(true);
//  win.setVisible(true);

//  Full Screen
//  win.setLocation( 0, 0 );
//  win.setSize( Toolkit.getDefaultToolkit().getScreenSize() );

  win.setVisible(true);
  return win;
}

Jetzt muss das Ganze natürlich noch aufgerufen werden:

// Window Size: x, y
int[] winSize = new int[]{830, 800};
JFrame mainwin = createFrame("Titel",winSize[0],winSize[1]);

// Set LookAndFeel to Nimbus (Looks better)
try {
  UIManager.setLookAndFeel(
    "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch(Exception e) {
  System.out.println("Error setting Nimbus LAF: " + e);
}

mainwin.setLayout(new FlowLayout());
JTabbedPane tabs = new JTabbedPane();
tabs.setPreferredSize(new Dimension(winSize[0],winSize[1]));
mainwin.add(tabs);
JPanel pHome = new JPanel();
tabs.addTab("Home", pHome);
JPanel pPlayer = new JPanel();
tabs.addTab("Player", pPlayer);
...

Wir haben nun ein schönes Tablayout mit dem wir arbeiten können.
Natürlich lässt es sich um beliebig viele Tabs erweitern.

Nützlich: Mit .setPreferredSize(Dimension d) lässt sich die Größe von einzelnen Elementen einstellen.

Nun macht es Sinn, die GUI als eigenen Thread laufen zu lassen.
Man kann so Aktualisierungen im Hintergrund laufen lassen.
Daher deklarieren wir die Klasse folgendermaßen:

public class Gui extends Thread{
//  Vars

  public Gui() {
  JFrame mainwin = createFrame("Title", 800, 600);
//  ... see above
  }

  @Override
  public void run() {
//  Do some refreshs ...
  sleepG(1000);
  }
}

Mit

public static void sleepG(int msec){
  try {
    Thread.sleep(msec);
  } catch (InterruptedException e) {
    System.err.println("Da hats doch grad nen sleep gekillt...");
    e.printStackTrace();
  }
}

Die InterruptedException muss schließlich aufgefangen werden.

Der Aufruf ist wie folgt:

Gui g = new Gui();
g.start();

Merke: Die Threadfunktion wird zwar als “run” deklariert, wird aber als “start” aufgerufen.
Mit g.run(); würden wir den Inhalt der Funktion sequentiell anstarten und nicht parallel in einem eigenen Thread.

Da wir in der GUI-Erstellung
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gesetzt haben, wird das gesamte Programm beim Schließen der GUI beendet.
Alternativ: .DO_NOTHING_ON_CLOSE

Kommentare deaktiviert

Java: InputBox


2010
07.14

Wie einige ja wissen, lerne ich gerade Java.
Andere wissen auch: Java ist auch eine Insel! (Das Buch ist toll für den Einstieg)

Da man in Java ja gerne Code recycelt, hab ich mir gedacht, ich schreib hier einfach mal n paar nützliche Schnipsel auf.
Vielleicht findet sie ja jemand und muss sich nicht danach kaputtsuchen wie ich :)

Inputboxen erstellt man einfach mit JOptionPane aus dem Swing Set.

String var = "";
var = javax.swing.JOptionPane.showInputDialog(null, "Text", "Titel", JOptionPane.QUESTION_MESSAGE, null, null, "DEFAULT");
// var = javax.swing.JOptionPane.showInputDialog(PARENT, TEXT, TITLE, MESSAGE_TYPE, null, null, "DEFAULT");

Wenn das ganze nun einen Integerwert abfragen soll sieht die Geschichte schon anders aus.
Die Eingabe muss nun in eine Ganzzahl umgewandelt werden.

int spd = 0;
try {
  spd = Integer.valueOf((String) javax.swing.JOptionPane.showInputDialog(null, "X Minuten pro Sekunde", "Geschwindigkeitsmultiplikator", JOptionPane.QUESTION_MESSAGE, null, null, "5"));
  if (spd < 1)
    spd = 1;
  else if (spd > 250)
    spd = 250;
} catch (NumberFormatException e) {
  spd = 10;
}

Möglicherweise funktioniert das auch ohne valueOf und (String). So funktioniert es aber sicher und wirft die genannte NumberFormatException wenn keine Zahl eingegeben wird.

Um das ganze noch zu vervollständigen. So geht eine einfache Messagebox:

JOptionPane.showMessageDialog(null, "Text", "Titel", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "Text");