Guten Abend,
ich habe ein Problem, dass ich nun schon seit einiger Zeit versuche zu lösen, und einfach nicht drauf komme, woran es liegen könnte.
Ich habe zwei Klassen geschrieben: eine "main"-Klasse (Intersection), und eine "Zeichen"-Klasse (IntersectionDrawer). Ich möchte am Ende vier Instanzen der Zeichen-Klasse haben, also sozusagen vier JPanels (Zeichenflächen) (ok, eigentlich fünf, aber den Hintergrund lasse ich erstmal raus). Ich habe allen die gesamte Fläche des JFrame zugewiesen, sodass überall gezeichnet werden kann von allen vieren. Nun stehe ich vor dem Problem, dass ich alle vier in verschiedenen Bereichen zeichnen lasse, aber am Ende nur das zuletzt gezeichnete Rechteck sichtbar ist?
Ich habe auch eine Testklasse (TestDrawer), um meinem Problem näher zu kommen, geschrieben, und in dieser funktioniert alles wunderbar? Also dort wird nichts überzeichnet etc.
Ich wäre sehr dankbar, wenn jemand sich die Zeit nehmen würde, und dieses sicher einfache Problem lösen könnte
ich habe ein Problem, dass ich nun schon seit einiger Zeit versuche zu lösen, und einfach nicht drauf komme, woran es liegen könnte.
Ich habe zwei Klassen geschrieben: eine "main"-Klasse (Intersection), und eine "Zeichen"-Klasse (IntersectionDrawer). Ich möchte am Ende vier Instanzen der Zeichen-Klasse haben, also sozusagen vier JPanels (Zeichenflächen) (ok, eigentlich fünf, aber den Hintergrund lasse ich erstmal raus). Ich habe allen die gesamte Fläche des JFrame zugewiesen, sodass überall gezeichnet werden kann von allen vieren. Nun stehe ich vor dem Problem, dass ich alle vier in verschiedenen Bereichen zeichnen lasse, aber am Ende nur das zuletzt gezeichnete Rechteck sichtbar ist?
Ich habe auch eine Testklasse (TestDrawer), um meinem Problem näher zu kommen, geschrieben, und in dieser funktioniert alles wunderbar? Also dort wird nichts überzeichnet etc.
Ich wäre sehr dankbar, wenn jemand sich die Zeit nehmen würde, und dieses sicher einfache Problem lösen könnte
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package intersection;
import javax.swing.*;
//import java.awt.*;
/**
* Intersection_v1.0-mainClass
* This class is responsible for:
* - creating the mainFrame in which the intersection-action will take place!
* @author EKzyis
*/
public class Intersection extends JFrame {
/*
Creating the instances of other needed classes like background, painting and threading.
*/
IntersectionDrawer background;
IntersectionDrawer[] trafficLight;
/*
Creating the mainFrame and naming it "Intersection-Action_v1.0"
and afterwards setting it visible.
*/
public static void main(String[] args) {
Intersection frame = new Intersection("Intersection-Action_v1.0",750,750);
frame.setVisible(true);
}
/*
Initializing the mainFrame and adding needed components for later use.
*/
public Intersection(String title, int x, int y) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,x,y);
setLayout(null);
setResizable(false);
/*background = new IntersectionDrawer
(0,"A:\\#Programming\\NetBeans Projects\\Intersection\\build\\classes\\intersection\\"
+ "intersection_1000x1000_v2.png",x,y);
background.setBounds(0,0,x,y);
add(background);*/
trafficLight = new IntersectionDrawer[4];
for(int i=0;i<trafficLight.length;i++) {
trafficLight[i] = new IntersectionDrawer(i+1,x,y);
trafficLight[i].setStatus(1);
System.out.println("trafficLight["+(i+1)+"] was initialized!");
trafficLight[i].setBounds(0,0,x,y);
add(trafficLight[i]);
}
}
}
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package intersection;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* This class is responsible for:
* - drawing the traffic lights.
*
* Explanation for int status:
* - status=0 --> trafficLight shows red-phase
* - status=1 --> trafficLight shows red-yellow-phase
* - sttaus=2 --> trafficLight shows green-phase
* - status=3 --> trafficLight shows green-yellow-phase
* from status=3, trafficLight switches to status=0 (red-Phase) and a new loop
* starts.
* - status=-1 --> trafficLight is "off" / stops switching phases.
* This means, a red-phase light will stay red until status get another value
* like 2 etc.
* - status=-2 || id=0 --> Object handles the background.
* @author EKzyis
*/
public class IntersectionDrawer extends JPanel {
BufferedImage img;
int x,y;
int id;
int status;
IntersectionDrawer(int id, String filepath, int x, int y) {
this.id = id;
System.out.println("IntersectionDrawer(String,int,int) has been invoked "
+ "by Object with ID: "+this.getId()+"!");
this.x = x;
this.y = y;
this.status = -2;
try
{
img = ImageIO.read(new File(filepath));
System.out.println("FILE FOUND");
}
catch (IOException e)
{
System.out.println("FILE NOT FOUND");
}
System.out.println("Object-ID: "+this.getId()+" Object-Status: "
+ ""+this.getStatus());
}
IntersectionDrawer(int id, int x, int y) {
this.id = id;
this.x = x;
this.y = y;
System.out.println("IntersectionDrawer() has been invoked by Object "
+ "with ID: "+this.getId()+"!");
System.out.println("Object-ID: "+this.getId()+" Object-Status: "
+ ""+this.getStatus());
}
public int getId() {
return id;
}
public void setStatus(int status) {
System.out.println("setStatus(int) has been invoked by Object with ID: "
+ ""+this.getId()+"!");
this.status = status;
System.out.println("Object-ID: "+this.getId()+" Object-Status: "
+ ""+this.getStatus());
}
public int getStatus() {
return status;
}
@Override
public void paintComponent(Graphics g) {
System.out.println("paintComponent(Graphics) has been invoked by Object "
+ "with ID: "+this.getId()+" and Status: "+this.getStatus()+"!");
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;;
/*if(this.getId()==0) {
g2.drawImage(img,0,-15,x,y,null);
System.out.println("Background has been painted!");
}*/
switch(this.getId()) {
case 1:
g2.setColor(Color.BLACK);
g2.fillRect(200, 200, 100, 100);
break;
case 2:
g2.setColor(Color.RED);
g2.fillRect(400,200,100,100);
break;
case 3:
g2.setColor(Color.BLUE);
g2.fillRect(200, 400, 100, 100);
break;
case 4:
g2.setColor(Color.YELLOW);
g2.fillRect(400, 400, 100, 100);
break;
}
}
}
Java:
package testdrawer;
import javax.swing.*;
/**
*
* @author EKzyis
*/
public class TestDrawer extends JFrame {
TestDrawerPanel[] panel;
public static void main(String[] args) {
TestDrawer frame = new TestDrawer("TestDrawer");
frame.setVisible(true);
}
TestDrawer(String title) {
super(title);
setBounds(100,100,500,500);
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new TestDrawerPanel[2];
panel[0] = new TestDrawerPanel(1);
panel[0].setBounds(0,0,500,500);
add(panel[0]);
panel[1] = new TestDrawerPanel(2);
panel[1].setBounds(0,0,500,500);
add(panel[1]);
}
}
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package testdrawer;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
/**
*
* @author EKzyis
*/
class TestDrawerPanel extends JPanel
{
int id;
TestDrawerPanel(int id) {
this.id = id;
System.out.println("TestDrawerPanel(int)");
}
@Override
public void paintComponent(Graphics g){
System.out.println("paintComponent(Graphics)");
Graphics2D g2 = (Graphics2D)g;
if(id==1){
g2.setColor(Color.RED);
g2.fillRect(250,250,500,500);
System.out.println("1.1");
g2.setColor(Color.BLUE);
g2.fillRect(200,200,100,100);
System.out.println("1.2");
}
if(id==2){
g2.setColor(Color.BLACK);
g2.fillRect(0,0,450,450);
System.out.println("2");
}
}
}
Zuletzt bearbeitet: