Java JComboBox mit ItemStateChanged

Wird ein Eintrag eines Kombofeldes (JComboBox) ausgewählt, werden ohne weitere Angaben zwei Werte übergeben. Der de-selektierte und der selektierte Wert.

Dies kann dazu führen das Ergebnisse (Maßnahmen) doppelt ausgeführt oder angezeigt werden. Um dies zu verhindern kann gezielt angegeben werden, dass auf den de- oder selektierten Wert reagiert werden soll.

@Override
public void itemStateChanged(ItemEvent e) {
// wenn der Ausloeser von der JComboBox kommt
if (e.getSource() instanceof JComboBox) {
/*
* die folgende if Anweisung verhindert die doppelte
* Wertuebergabe. Ohne diese Anweisung wuerde
* deselected & selected uebergeben werden
*/
if (e.getStateChange() == ItemEvent.SELECTED) {
// ausgewaehlten Index speichern
indexDummy = auswahlMenue.getSelectedIndex();
System.out.println(e.getItem());
// berechnen () gibt Wert an Aufrufer zurueck
// diesen Wert ausgeben
ausgabe.setText(berechnen(indexDummy));
}
}
}

FensterSchubser

Der FensterSchubser ermittelt die Bildschirmgröße, positioniert sich mittig auf dem Startbildschirm und lässt sich dann mittels Schaltflächen bewegen. Das Fenster wird je 10px in die gewünscht Richtung bewegt, bis die Bildschirmgrenze erreicht ist.

Die Bildschirmmitte wird mit zwei unterschiedlichen Methoden ermittelt, einmal für den Hinweis beim Programmstart und für das Programm selbst.

Weiter wird die Taskleiste (sofern auf dem Startbildschirm vorhanden) berücksichtigt.

 


/*fensterSchubser
Copyright (C) 2015 Timo Wosnitza

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.*/

/**
* Dieses Programm erstellt ein Fenster mit vier Button. Ueber diese
* Button laesst sich das Fenster in die entsprechende Richtung bewegen.
* Vor dem eigentlichen Programm wird ein kleines Hinweisfenster zur
* Bedienung gezeigt.
* Fuer die Positionierung des Hinweis- und Programmfesnters wurden zwei
* Unterschiedliche Methoden benutzt.
*/

package einsendeaufgabe;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FensterGUI extends JFrame {

private static final long serialVersionUID = 1L;

// Attribute
protected JButton oben, rechts, unten, links;
protected final int X = 10;
protected final int SCHRIFTGROESSE = 10;
protected final String BEREICHVERLASSENTEXT = "Sie versuchen den erlaubten Bereich zu verlassen\n"
+ "Das schubsen ist nur auf dem primären Bildschirm erlaubt ;)";

// Fensterpositionierung
protected Toolkit tk = Toolkit.getDefaultToolkit();
protected Dimension bildschirmGroesse = tk.getScreenSize();
// minus "Wert" da die Haelfte des Fensters beruecksichtig werden muss
// sonst wird nur die Ecke oben Links zentriert
protected int width = ((bildschirmGroesse.width - getSize().width) / 2) - 100;
protected int height = ((bildschirmGroesse.height - getSize().height) / 2) - 100;

//height of the task bar
protected Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
protected int taskBarSize = scnMax.bottom;

// Max Werte fuer Bildschirm, hier gibt es Unterschiede zwischen Windows und
// Linux (bei mehreren Bildschirmen)
protected final int WIDHTMAX = (int) bildschirmGroesse.getWidth() -210;//-10 Fensterrahmen links und rechts je 5px
protected final int HEIGHTMAX = (int) ((bildschirmGroesse.getHeight() -205) - taskBarSize);//Fensterrahmen unten 5px

// Konstruktor
public FensterGUI(String titel) {
super(titel);
System.out.println("Ermittelte Bildschirmgroesse: " + bildschirmGroesse.getWidth() + " " + bildschirmGroesse.getHeight());
System.out.println("davon benutzbar: " + bildschirmGroesse.getWidth() + " " + (bildschirmGroesse.getHeight()-taskBarSize));
System.out.println("Hoehe der Taskleiste: " + taskBarSize);
System.out.println("aktuell gesetzte Grenzen " + WIDHTMAX + " " + HEIGHTMAX + " beruecksichtig die Taskleiste und den Nullpunkt des Fensters (oben links)");
System.out.println("Startposition des Hauptfensters " + width + " " + height);
setLayout(new BorderLayout(25, 25));
// der Uebersicht wegen wurden Methoden erstellt
komponentenHinzufuegen();
layoutErstellen();
}// Konstruktor Ende

// Methode fuer die Komponenten
public void komponentenHinzufuegen() {

// Listener
InnererListener listener = new InnererListener();
// "Button" erzeugen
oben = new JButton("nach oben");
rechts = new JButton("nach rechts");
unten = new JButton("nach unten");
links = new JButton("nach links");

/*
* unter Linux sind die JButton zu gross da die Schriftgroesse nicht
* passt, daher werden die Button auf eine feste groesse gesetzt und im
* Konstruktor die Groesse der Schrift festgelegt
*/
oben.setPreferredSize(new Dimension(35, 35));// Weite wird ignoriert
rechts.setPreferredSize(new Dimension(90, 35));
unten.setPreferredSize(new Dimension(35, 35));// Weite wird ignoriert
links.setPreferredSize(new Dimension(90, 35));

// Schrift anpassen
oben.setFont(new Font("Arial", Font.PLAIN, SCHRIFTGROESSE));
rechts.setFont(new Font("Arial", Font.PLAIN, SCHRIFTGROESSE));
unten.setFont(new Font("Arial", Font.PLAIN, SCHRIFTGROESSE));
links.setFont(new Font("Arial", Font.PLAIN, SCHRIFTGROESSE));

// zuweisen actionCommand
oben.setActionCommand("nach oben");
rechts.setActionCommand("nach rechts");
unten.setActionCommand("nach unten");
links.setActionCommand("nach links");

// listener verbinden
oben.addActionListener(listener);
rechts.addActionListener(listener);
unten.addActionListener(listener);
links.addActionListener(listener);

}// Ende komponentenHunzufuegen

// Methode fuer das Layout
public void layoutErstellen() {

// Groesse des Fesnters setzen
setSize(200, 200);
/*
* nach max. des Fensters koennte dies nicht mehr "geschoben" werden, da
* die max Koordinaten erreicht waeren, daher wird das Aendern der
* Fenstergroesse deaktiviert.
*/
setResizable(false);

// Position des Fensters setzen
setLocation(width, height);

// Buttons anordnen/zuweisen, center soll frei bleiben
// this.add(oben, BorderLayout.NORTH);
this.add(oben, BorderLayout.PAGE_START);// north
this.add(rechts, BorderLayout.LINE_END);// east
this.add(unten, BorderLayout.PAGE_END);// south
this.add(links, BorderLayout.LINE_START);// west
// Listener damit das Hinweisfenster bei Programmstart angezeigt wird
addWindowListener(new InnererListener());

// Programm beenden wenn Fenster geschlossen wird
setDefaultCloseOperation(EXIT_ON_CLOSE);

// Fenster sichtbar machen
setVisible(true);

}// Ende layoutErstellen

// Innere Klasse fuer Listener
class InnererListener extends WindowAdapter implements ActionListener, WindowListener {

// wenn Prgramm gestartet wird (Hinweisfenster)
@Override
public void windowOpened(WindowEvent ee) {
System.out.println("Programm wurde gestartet");
JOptionPane pane = new JOptionPane(
"Zum Schubsen auf den Button für die " + "entsprechende Richtung drücken.");
JDialog d = pane.createDialog((JFrame) null, "Willkommen beim Fensterschubser!");
// Fenster zentrieren
d.setLocationRelativeTo(null);
d.setVisible(true);
}

// fuer die vier Button
@Override
public void actionPerformed(ActionEvent e) {

String weiche = e.getActionCommand();

if (weiche.equals("nach oben"))
// move window up
setFensterBewegerMethodeOben(X);
;
if (weiche.equals("nach rechts"))
// move window right
setFensterBewegerMethodeRechts(X);
;
if (weiche.equals("nach unten"))
// move window down
setFensterBewegerMethodeUnten(X);
;
if (weiche.equals("nach links"))
// move window left
setFensterBewegerMethodeLinks(X);
;

}

}

/*
* Methode um das Fenster nach oben zu bewegen
*/

public void setFensterBewegerMethodeOben(int X) {
if (height > 0) {
height -= X;
setLocation(width, height);
System.out.println(getX() + " - " + getY());
} else {
JOptionPane.showMessageDialog(null, BEREICHVERLASSENTEXT);
}
}

// Methode um das Fenster nach rechts zu bewegen
public void setFensterBewegerMethodeRechts(int X) {
if (width <= WIDHTMAX) {
width += X;
setLocation(width, height);
System.out.println(getLocation());
//weitere Möglihckeit fuer Koordinatenausgabe
System.out.println("X Koord " + getX() + " - " + " Y Koord " + getY());
} else {
JOptionPane.showMessageDialog(null, BEREICHVERLASSENTEXT);
}
}

// Methode um das Fenster nach unten zu bewegen
public void setFensterBewegerMethodeUnten(int X) {
if (height <= HEIGHTMAX) { height += X; this.setLocation(width, height); System.out.println(getX() + " - " + getY()); } else { JOptionPane.showMessageDialog(null, BEREICHVERLASSENTEXT); } } // Methode um das Fenster nach links zu bewegen public void setFensterBewegerMethodeLinks(int X) { if (width > 0) {
width -= X;
this.setLocation(width, height);
System.out.println(getX() + " - " + getY());
} else {
JOptionPane.showMessageDialog(null, BEREICHVERLASSENTEXT);
}
}

}

fensterSchubser.jar

Viel Spaß beim experimentieren, die Klasse mit der main() ist hier nicht aufgeführt da sie nur die oben abgebildete Klasse startet.

Java 8