Swing Random Checkbox JApplet

Semox

Bekanntes Mitglied
Hallo Forum

Ich hänge an einem Problem bei der Umwandlung eines AWT Applets in ein JApplet... Als ich das zuerst als klassisches Applet machte, konnte ich das Programm problemlos aufrufen.

Nun schreibt mir Eclipse, daß ich einen Instaziierungsfehler begehe, was mir irgendwie einleuchtet. Jedenfalls weiß ich aber nicht an welcher Stelle...

Hier ist mein JApplet:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Checkbox_test extends JApplet{

	private static final long serialVersionUID = -6367868076583433598L;
	Random r = new Random();

	public Checkbox_test(int size) {
		
		
		JFrame frame = new JFrame();
		frame.setLayout(new BorderLayout());
		frame.setTitle("Random Checkboxes activated/disengaged");
		JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
		this.getContentPane().add(panel, BorderLayout.SOUTH);

		JCheckBox[] cb_arr = new JCheckBox[size];

		for (int i = 0; i < cb_arr.length; i++) {
			String str = Integer.toString(i);
			cb_arr[i] = new JCheckBox(str, true);
			int r_ = r.nextInt(255);
			int g_ = r.nextInt(255);
			int b_ = r.nextInt(255);
			Color c = new Color(r_, g_, b_);
			cb_arr[i].setBackground(c);
			panel.add(cb_arr[i]);

		}
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		new Checkbox_test(12);
	}
}

Muß man ein JPanel in ein JFrame einfügen? Dazu habe ich wenig Hilfreiches bis viel Verwirrendes gefunden. Muß man ein JPanel in ein JFrame einfügen? Dazu habe ich wenig hilfreiches gefunden. Was muß denn da verändert werden, damit das JApplet endlich arbeitet?

Gruß,
Semo
 
init Method

The init method is useful for one-time initialization that doesn't take very long. The init method typically contains the code that you would normally put into a constructor. The reason applets don't usually have constructors is that they aren't guaranteed to have a full environment until their init method is called. Keep the init method short so that your applet can load quickly.

Lesestoff: Lesson: Applets (The Java™ Tutorials > Deployment)

Java:
public class Checkbox_test extends JApplet {

    private static final long serialVersionUID = -6367868076583433598L;
    Random r = new Random();

    public void init() {
	JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
	this.getContentPane().add(panel, BorderLayout.SOUTH);
	JCheckBox[] cb_arr = new JCheckBox[12];
	for (int i = 0; i < cb_arr.length; i++) {
	    String str = Integer.toString(i);
	    cb_arr[i] = new JCheckBox(str, true);
	    int r_ = r.nextInt(255);
	    int g_ = r.nextInt(255);
	    int b_ = r.nextInt(255);
	    Color c = new Color(r_, g_, b_);
	    cb_arr[i].setBackground(c);
	    panel.add(cb_arr[i]);
	}
    }
}
 
Jede Komponente, die in deinem Frame oder Applet sichtbar sein soll, muss mit add() hinzugefügt werden. Wieso erbt deine Klasse von JApplet, wenn sie dann doch ein JFrame erstellt?
 
Danke Euch Beiden!

... Ich habe versucht mich an die Vorgaben meiner Professorin zu halten, die mir diese Einsendeaufgabe gegeben hat.

Deswegen versucht ich das Panel und den Frame zu nutzen. Vielleicht bin ich auch auf einem ganz falschen Dampfer, wie ich das angefangen habe? Was meint Ihr?

Im Anhang ist die PDF...

Grüße,
Semo
 
Da steht doch garnichts davon, dass du ein (J)Applet bauen sollst? Also war dein Ansatz mit dem JFrame garnicht so schlecht, allerdings sollte dann das [c]extends JApplet[/c] weg.

Dann fehlen noch einige Kleinigkeiten und dann sieht`s doch gut aus 😀:
- Es kann immer nur ein einziges CheckBox-Objekt angeschaltet sein. (Group!)
- Das CheckBox-Objekt, das am Anfang der Ausführung angeschaltet ist, wird zufällig bestimmt.
 
Nein, wie kommst du immer darauf dass du ein Applet bauen sollst? Du sollst doch anscheinend ein Applet zu einer normalen Anwendung umbauen

Das Applet Checkb22 soll in eine Anwendung namens CheckApp umgewandelt werden und
zusätzliche Anforderungen erfüllen.

???:L
 
... Damit bin ich quasi wieder an einem Teilproblem. Ich habe nun den Code derart verändert:

Dadurch habe ich wieder ein InstantiationException... Das verstehe ich nicht... Ich habe nun einen Konstruktor mit einem Haufen Anweisungen und eine main() Methode, die eigentlich die Menge Checkboxen übergeben soll... Warum geht das denn nicht? Irgendwas übersehe ich...

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JCheckBox;
import javax.swing.JPanel;

public class Checkbox_test extends JApplet {

	private static final long serialVersionUID = -6367868076583433598L;
	Random r = new Random();

	public Checkbox_test(int size) {

		// JFrame frame = new JFrame();
		// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// frame.setLayout(new BorderLayout());
		// frame.setTitle("Random Checkboxes activated");
		JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
		this.getContentPane().add(panel, BorderLayout.SOUTH);

		JCheckBox[] cb_arr = new JCheckBox[size];

		for (int i = 0; i < cb_arr.length; i++) {
			String str = Integer.toString(i);
			cb_arr[i] = new JCheckBox(str, true);
			int r_ = r.nextInt(255);
			int g_ = r.nextInt(255);
			int b_ = r.nextInt(255);
			Color c = new Color(r_, g_, b_);
			cb_arr[i].setBackground(c);
			panel.add(cb_arr[i]);

		}
		// frame.setVisible(true);
	}


	 public static void main(String[] args) { new Checkbox_test(12); }
}

EDIT: Um JApplet komme ich leider nicht herum, weil es ein Teil der Anweisung in der Aufgabe ist...

Viele Grüße
Semo
 
Zuletzt bearbeitet:
Entweder du baust eine Applikation, dann hast du eine main-Methode, die den Konstruktor aufruft oder du baust ein Applet, dann wird die init() Methode aufgerufen.
 
Dann verstehe ich noch nicht, wie ich nun ohne extends JApplet diese Anweisung durchführen soll:

Jpanel hat ein Flow-Layout, während JFrame ein Border-Layout hat. Praktisch ist es,
alle erzeugten JCheckBox-Objekte in ein Objekt panel vom Typ JPanel einzufügen, und das
Objekt panel mit Hilfe der Methode getContentPane() in this einzufügen, etwa so:
this.getContentPane().add(panel, BorderLayout.SOUTH);
​

Mal anders gefragt, verstehst Du was meine Professorin meint?

Gruß,
Semo
 
Ja,

das this.getContentPane(). bezieht sich in dem Fall nicht auf das JApplet, sondern auf JFrame. Du kannst auch vom JFrame erben!
Also anstatt extends JApplet, kannst du extends JFrame schreiben.

Dann musst du halt nicht new JFrame().. und frame. .... schreiben

Java:
 // JFrame frame = new JFrame();
        // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // frame.setLayout(new BorderLayout());
        // frame.setTitle("Random Checkboxes activated");
usw. sondern kannst this benutzen!

Dein erster gepostete Code war daher garnicht so verkehrt:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.util.Random;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Checkbox_test extends JFrame{
    
    private static final long serialVersionUID = -6367868076583433598L;
    Random r = new Random();
 
    public Checkbox_test(int size) {

        this.setLayout(new BorderLayout());
        this.setTitle("Random Checkboxes activated/disengaged");
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));

        JCheckBox[] cb_arr = new JCheckBox[size];
 
        for (int i = 0; i < cb_arr.length; i++) {
            String str = Integer.toString(i);
            cb_arr[i] = new JCheckBox(str, true);
            int r_ = r.nextInt(255);
            int g_ = r.nextInt(255);
            int b_ = r.nextInt(255);
            Color c = new Color(r_, g_, b_);
            cb_arr[i].setBackground(c);
            panel.add(cb_arr[i]);
 
        }
        this.getContentPane().add(panel, BorderLayout.SOUTH);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
 
    public static void main(String[] args) {
        new Checkbox_test(12);
    }
}

(jetzt fehlen aber immernoch die von mir schon o.g. Anforderungen!)

/edit: Das Checkbox-Array brauchst du laut Aufgabe garnicht glaub ich 😀
 
Zuletzt bearbeitet:
Hallo eRaaaa

In der Tat - das steht nicht drin. Aber ich es ist hilfreich, um die Dinger mit einem Namen (Zahl) zu versehen.

Wegen der Random Geschichte... Ich hatte kann man über eine Bedingung alle Checkboxes auf false setzen und eine auf true? Wenn ich die nämlich in eine Checkbox Group packe, dann werden es ja Radiobuttons... Das ist nicht so gewollt, glaube ich, laut Screenschott...

Viele Grüße
Semo
 
Also ich würde sie einfach am Anfang nicht alle auf true setzen:

Java:
 cb_arr[i] = new JCheckBox(str);

und nach der Schleife einfach:
Java:
	cb_arr[r.nextInt(size)].setSelected(true);

per Zufall eine selektieren.

Das mit der Group hab ich schon so verstanden, denn da steht ja:
Es kann immer nur ein einziges CheckBox-Objekt angeschaltet sein

daher würde ich einfach vor der Schleife:

Java:
ButtonGroup group = new ButtonGroup();

und innerhalb
Java:
group.add(cb_arr[i]);

und dann sollte alles passen 😀

(ich hatte oben in meinem Code dein
Code:
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
vergessen, das würde ich wieder mit reinnehmen, genauso wie ein Aufruf von [c] this.pack();[/c] VOR
Code:
this.setVisible
(true) )
 
Hallo eRaaaa

Ein Riesendankeschön für Deine Hilfe... :applaus: :applaus:

Es klappt alles...!

Für alle anderen die es Lernen wollen, poste ich hier den vollständigen Code...

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Checkbox_test extends JFrame {

	private static final long serialVersionUID = -6367868076583433598L;
	Random r = new Random();

	public Checkbox_test(int size) {

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());
		this.setTitle("Random Checkboxes activated");
		JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
		this.getContentPane().add(panel, BorderLayout.SOUTH);

		JCheckBox[] cb_arr = new JCheckBox[size];
		ButtonGroup group = new ButtonGroup();

		for (int i = 0; i < cb_arr.length; i++) {
			String str = Integer.toString(i);
			cb_arr[i] = new JCheckBox(str);
			int r_ = r.nextInt(255);
			int g_ = r.nextInt(255);
			int b_ = r.nextInt(255);
			Color c = new Color(r_, g_, b_);
			cb_arr[i].setBackground(c);
			group.add(cb_arr[i]);
			panel.add(cb_arr[i]);

		}
		cb_arr[r.nextInt(size)].setSelected(true);
		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new Checkbox_test(12);
	}
}

Besten Dank und einen schönen Abend wünsche ich Dir,
Semo
 

Neue Themen


Zurück
Oben