Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe eine Klasse, die den Frame bereitstellt. Eine zweite Klasse bildet die Menüleiste und wird dem Frame geaddet. Ein dritte Klasse ist ein Panel mit den Steuerelementen, usw.
Im Menü habe ich nun ein JCheckBoxMenuItem. Wie kriegt nun z.B. ein Button in der dritten Klasse mit, ob das gecheckt ist oder nicht?
Soll ich ein "globales Flag" setzen, oder geht das auch geschickter???????
hast Du evtl. ein Bsp. dafür. Ich hab zwar schon darüber gelesen, kann es aber nicht umsetzen. Kann ich nur die CheckBox singleton machen, oder die ganze Klasse, oder wie??? ???:L
Du machst eine eigene Klasse, welche von JCheckBox erbt...
z.B.: so
Code:
public class MyCheckBox extends JCheckBox {
private final static MyCheckBox box = new MyCheckBox();
private MyCheckBox() {}
public static MyCheckBox getInstance() {
return box;
}
}
Anstatt, dass du nun deine Checkbox so erstellst new JCheckBox, machst du es so MyCheckBox.getInstance().
Da du immer das gleiche Objekt zurückbekommst, kannst du das ja auch in den anderen Klassen verwenden.
mhm - hier geht es doch um ein JCheckboxMenuItem - nich JCheckbox.... ?!
Aber das wäre auch nicht der Renner - wenn du nur eine Instanz erlaubst, aber mehrer Checkboxe nutzen willst kommts zum Konflikt !
füge dem Menu einen SelectionListener oder ähnliches hinzu die Klasse die darauf reagieren soll ist entweder der Listener selbst oder der Listener kennt diese Klassen
ok - ist ItemListener, nicht SelectionListener....
so könnte man es z.b. machen:
Code:
public class MyFrame extends JFrame {
public MyFrame() {
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel panel = new MyPanel();
setJMenuBar(new MyMenu(panel));
setContentPane(panel);
pack();
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
Code:
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
/*
* Created on 07.12.2004
*/
/**
* @author Andreas Groscurth
*/
public class MyPanel extends JPanel implements ItemListener {
private JLabel label;
public MyPanel() {
super();
setPreferredSize(new Dimension(400,400));
label = new JLabel("");
add(label);
}
/* (non-Javadoc)
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
label.setText("selected");
}
else {
label.setText("not selected");
}
}
}
Code:
public class MyMenu extends JMenuBar {
public MyMenu(ItemListener checkboxlistener) {
super();
JMenu m = new JMenu( "test" );
JMenuItem i = new JMenuItem( "tt" );
m.add( i );
JCheckBoxMenuItem ii = new JCheckBoxMenuItem( "check" );
ii.addItemListener( checkboxlistener);
m.add( ii );
add( m );
}
}
Es wird eine Instanz von MyMenu erzeugt, der eine Referenz auf MyPanel übergeben wird. Das erzeugt MyMenu wird dann, über die Methode setJMenuBar , dem JFrame übergeben, damit es entsprechend positioniert wird.
da bin ich wieder. Musste erstmal ne Nacht drüber schlafen.
Vorab erstmal vielen Dank für eure Mühe. Hat mir sehr weitergeholfen.
Ich habe mich jetzt für eine Kombination aus Listener und Singelton entschieden.
Und zwar deshalb:
Abhängig vom Status des CheckBoxMenuItem wird ein Button enabled bzw. disabled. Dieser Button macht nichts weiter, als eine Datei zu erzeugen. Ist der Button disabled und also das CheckBoxMenuItem "gecheckt", soll bei Programmende besagte Datei automatisch erzeugt werden. Daher muss ich bei Programmende wissen, welchen Status diese CheckBox hat.
Der Listener macht also nicht weiter, als den Button zu enablen bzw. disablen. Ausserdem setzt er ein Flag im Singleton. Das sieht so aus:
public class CheckBoxState {
private static CheckBoxState instance = null;
private boolean Flag = false;
/**
*
*/
private CheckBoxState() {
super();
}
public static CheckBoxState getInstance() {
if (instance == null) {
instance = new CheckBoxState();
}
return instance;
}
public void setFlag(boolean Flag) {
this.Flag = Flag;
}
public boolean getFlag() {
return this.Flag;
}
}
Zu guter letzt habe ich mir einen ClosingAdapter geschrieben, welcher auch als Listener verwendet werden kann. Somit kann ich (egal wie das Prog beendet wird) die Datei beim Beenden erzeugen, oder eben nicht.
Code:
public class WindowClosingAdapter extends WindowAdapter implements
ActionListener {
private boolean exitSystem;
private CheckBoxState checkboxstate = CheckBoxState.getInstance();
private MapFileCreator mapfilecreator = new MapFileCreator();
/**
* Erzeugt einen WindowClosingAdapter zum Schliessen des Fensters. Ist
* exitSystem true, wird das komplette Programm beendet.
*
* Dieser WindowClosingAdapter kann auch als ActionListener zum Beenden
* eines Programms verwendet werden. In diesem wird exitSystem ignoriert.
*
* @param exitSystem
* TRUE, wenn das Programm beendet werden soll.
*/
public WindowClosingAdapter(boolean exitSystem) {
this.exitSystem = exitSystem;
}
/**
* Erzeugt einen WindowClosingAdapter zum Schliessen des Fensters. Das
* Programm wird nicht beendet.
*
* Dieser WindowClosingAdapter kann auch als ActionListener verwendet
* werden. Dann wird das Programm beendet.
*/
public WindowClosingAdapter() {
this.exitSystem = false;
}
/**
* Fenster schliessen und Programm beenden, wenn exitSystem true ist.
*/
public void windowClosing(WindowEvent event) {
event.getWindow().setVisible(false);
event.getWindow().dispose();
if (exitSystem) {
if (checkboxstate.getFlag()) {
mapfilecreator.createNewMapFile();
}
System.exit(0);
}
}
/**
* Egal, welcher Konstruktor benutzt wurde, das Programm wird immer beendet,
* wenn der WindowClosingAdapter als ActionListener eingesetzt wird.
*/
public void actionPerformed(ActionEvent event) {
/*
* evtl. Aufruf weiterer Methoden, die vor Beendigung des Programms
* ausgeführt werden sollen.
*/
if (checkboxstate.getFlag()) {
mapfilecreator.createNewMapFile();
}
System.exit(0);
}
}
So, ist das. Was sagen die Profis dazu?? Kann man das so lassen?