Hallo Leute ,
ich bin neu hier also srii falls ich das hier in den falschen Thread gepostet hab.
Also ich habe folgendes Problem. Ich habe ein Frame mit einem GridBagLayout Raster das variabel viele Panels erstellt und in einem Raster anordnet mit etwas Abstand.
In den Kästen hab ich Kreise drin...und ich will jetzt von der Mitte von einem Kreis zur Mitte an einem anderen Kreis eine Linie ziehen. Ich hab das versucht, indem ich feste Werte eingegeben hab, aber wenn man das Fenster etwas verschiebt, stimmen die ganzen Koordinaten ja nicht mehr, deswegen meine Frame, wie kann ich das dynamisch machen, dass ich die Mitte herausfinde von den jeweiligen Panels, die einen zentrierten Kreis enthalten, und dann ein Kreis ziehe, ich bekomm immer nur die Mitte von den Panels mit den Komponenten-Koordinaten die stimmen ja nicht, da ich mehrere Panels in nem Raster in nem Frame hab.
Hier meine Hauptklasse:
Das ist meine Klasse, die die PanelFelder enthält:
Und das das einzelne Feld, das mehrfach in dem Raster erstelllt und angeordnet wird:
Wäre sehr nett wenn jemand eine Idee hätte
Vielen Dank im Vorraus.
ich bin neu hier also srii falls ich das hier in den falschen Thread gepostet hab.
Also ich habe folgendes Problem. Ich habe ein Frame mit einem GridBagLayout Raster das variabel viele Panels erstellt und in einem Raster anordnet mit etwas Abstand.
In den Kästen hab ich Kreise drin...und ich will jetzt von der Mitte von einem Kreis zur Mitte an einem anderen Kreis eine Linie ziehen. Ich hab das versucht, indem ich feste Werte eingegeben hab, aber wenn man das Fenster etwas verschiebt, stimmen die ganzen Koordinaten ja nicht mehr, deswegen meine Frame, wie kann ich das dynamisch machen, dass ich die Mitte herausfinde von den jeweiligen Panels, die einen zentrierten Kreis enthalten, und dann ein Kreis ziehe, ich bekomm immer nur die Mitte von den Panels mit den Komponenten-Koordinaten die stimmen ja nicht, da ich mehrere Panels in nem Raster in nem Frame hab.
Hier meine Hauptklasse:
Java:
public class Main extends JFrame
{
final int DefaultZeile = 3; int Zeilen=DefaultZeile;
final int DefaultSpalte = 3; int Spalten=DefaultSpalte;
final int DefaultKreis = 4; int AnzKreis=DefaultKreis;
int AnzFeld = Zeilen*Spalten;
int putZeile,putSpalte,putKreis;
int Rand;
static int Value=-1;
boolean end=false;
int with = this.getWidth();
int heig = this.getHeight();
private MyField [] RasterArray = new MyField [AnzFeld+1000];
ButtonListener bl = new ButtonListener();
JPanel MainPanel = new JPanel(); //ROOT
JPanel ButtonPanel = new JPanel(); //ROOT.1
JPanel ChilRaster = new JPanel(); //ROOT.2
JButton SetAll = new JButton("ALL");
JButton reset = new JButton("RESET");
JButton zufall = new JButton("ONE");
JButton change = new JButton("Change Layout");
JButton cleartext = new JButton("TEXT DELETE");
JTextField t1 = new JTextField("Zeile...");
JTextField t2 = new JTextField("Spalte...");
JTextField t3 = new JTextField("Kreis...");
JButton glass1 = new JButton ("1111");
JButton glass2 = new JButton ("2222");
JButton glass3 = new JButton ("3333");
static int Position=0;
int LaufVariable;
//-------------------------METHODEN-------------------------------------------------//
public static int getStelle(){
return Position;
}
public static void setStelle(){
Position++;
}
public static void setValueNull(){
Value=0;
}
public static void setValuePlus(){
Value++;
}
public static void setValueMinus(){
Value--;
}
public static int getValue(){
return Value;
}
public void Refresh(){
ChilRaster.setLayout(new GridLayout(this.Zeilen,this.Spalten,2,2));
ChilRaster.removeAll();
for (int i=0;i<this.AnzFeld;i++)
{
RasterArray[i] = new MyField(i);
ChilRaster.add(RasterArray[i]);
RasterArray[i].circle.Stelle++;
}
this.pack();
ChilRaster.repaint();
ChilRaster.validate();
MainPanel.repaint();
MainPanel.validate();
ChilRaster.repaint();
ChilRaster.validate();
ChilRaster.setVisible(false);
MainPanel.setVisible(false);
this.setVisible(false);
ChilRaster.setVisible(true);
MainPanel.setVisible(true);
this.repaint();
this.validate();
this.setVisible(true);
Main.this.setVisible(false);
Main.this.setVisible(true);
}
public void initValues(int z, int s, int k){
this.Zeilen = z;
this.Spalten = s;
this.AnzKreis = k;
this.AnzFeld=z*s;
}//END initValues
public int getRandom(int anzfeld){ //Liefert RandomZahl
Random r = new Random();
Rand=Math.round(r.nextInt(anzfeld-1)); //
return Rand;
}//END getRandom
public boolean isSetAll(){
boolean Voll;
int Set=0; //anz volle felder
for (int i=0;i<AnzFeld;i++){
if (RasterArray[i].circle.isDraw()){
Set++;
}
}
if (Set==AnzFeld){
Voll=true;
return Voll;
}
else {
Voll=false;
return Voll;
}
}//END isSetAll
//------------------------------------------------------------------------------------//
public Main() //Konstruktor---
{
super("Test DIE ZWEITE!");
super.setResizable(false);
super.setPreferredSize(new Dimension(650,550));
this.setBackground(Color.WHITE);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
ChilRaster.setBackground(Color.BLACK);
MainPanel.setLayout(new BoxLayout(MainPanel, BoxLayout.Y_AXIS));
ButtonPanel.setLayout(new GridLayout(2,2));
ChilRaster.setLayout(new GridLayout(Zeilen,Spalten,2,2));
MainPanel.setBackground(Color.BLACK);
MainPanel.add(ButtonPanel); //-->
ButtonPanel.add(SetAll);
ButtonPanel.add(reset);
ButtonPanel.add(zufall);
ButtonPanel.add(cleartext);
ButtonPanel.add(t1);
ButtonPanel.add(t2);
ButtonPanel.add(t3);
ButtonPanel.add(change);
/*final JPanel glass = (JPanel) this.getGlassPane();
glass.setLayout(new BorderLayout());
glass.add(glass1, BorderLayout.CENTER);
glass.add(glass2, BorderLayout.WEST);
glass.add(glass3, BorderLayout.EAST);*/
/*//...
JPanel pnlGlassPane = new JPanel(){
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(10, 10, 100, 100);
}
};
pnlGlassPane.setOpaque(false);
f.setGlassPane(pnlGlassPane);
f.getGlassPane().setVisible(true);
//...**/
JPanel intoGlass = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
int x1 = RasterArray[1].circle.getWidth()/4;
int y1 = RasterArray[1].circle.getHeight()/4;
int x2 = RasterArray[3].circle.getWidth()/2;
int y2 = RasterArray[3].circle.getHeight()/2;
Point p = RasterArray[2].circle.getLocation();
Point p2 = RasterArray[3].circle.getLocation();
//g.drawLine(x1,y1,x2,y2);
//g.drawLine(430/2,220,0,220/2);
g.drawLine(0,200,430,220);
//g.drawLine(430*2,220*2+10,0,220*2+10);
//g.drawLine(p.x+10, p.y+10, p2.x+10, p2.y+10);
//g.fillOval(10,10,100,100);
/*RasterArray[1].circle.getX();
int x2 = RasterArray[1].circle.getX();
int y1 = RasterArray[2].circle.getY();
int y2 = RasterArray[2].circle.getY();*/
}
};
intoGlass.setOpaque(false);
this.setGlassPane(intoGlass);
this.getGlassPane().setVisible(true);
/*final JPanel glass = (JPanel) this.getGlassPane();
glass.setLayout(new FlowLayout());
JButton GlassButton = new JButton("GLASSSS");
glass.add(GlassButton);
this.add(glass);
glass.setVisible(false);
*/
SetAll.addActionListener(bl);
reset.addActionListener(bl);
zufall.addActionListener(bl);
change.addActionListener(bl);
cleartext.addActionListener(bl);
MainPanel.add(ChilRaster); //->
for (int i=0;i<AnzFeld;i++) //Array füllen mit MyField
{
RasterArray[i] = new MyField(i);
ChilRaster.add(RasterArray[i]);
}
pack();
this.getContentPane().add(MainPanel);
/*for (int i=0;i<5;i++){ //5 Kreise die bereits gemalt sind !!!!
RasterArray[i].circle.setDraw(true);
repaint();
}*/
}
//---//
public class ButtonListener implements java.awt.event.ActionListener
{//Listener Anfang
public void actionPerformed(java.awt.event.ActionEvent e)
{
if( SetAll == e.getSource()) //n Kreise setzen
{//SetAll START
int Counter=0,Counter2=0; //Counter = Besetzte Felder
for (int j=0;j<AnzFeld;j++) //Überprüfung, besetzte Felder
{
if (RasterArray[j].circle.isDraw()){
Counter++;
}
}
int Rest = AnzFeld - Counter; //Rest = Leere Felder
if (isSetAll())
{
System.out.println("Alle Felder besetzt!");
//ABBRUCH
return; //wenn alle felder voll -> Abbruch
}
if (Rest >= AnzKreis) //Hier
{
//System.out.println("Rest: " + Rest + " AnzahlKreis: " + AnzahlKreis);
for (int i=0;i<AnzKreis;i++)
{
if(!RasterArray[getRandom(AnzFeld+1)].circle.isDraw()){
RasterArray[Rand].circle.setDraw(true);
}
else
{
i--;
}
}
System.out.println("Es wurden "+AnzKreis+" Kreise gesetzt!");
// System.out.println("rest: "+Rest);
}
else
{
System.out.println("Zu wenig freie Felder... ");
return;
}
}//SetAll END
else if (reset == e.getSource()) //RESET BUTTON - reset -> Spielfeld leeren!
{//-----RESET----//==WORK!
for (int i=0;i<AnzFeld;i++)
{
RasterArray[i].circle.setDraw(false);
}
t1.setText("Zeile..");
t2.setText("Spalte...");
t3.setText("Kreis...");
Zeilen = DefaultZeile;
Spalten = DefaultSpalte;
AnzKreis = DefaultKreis;
for (int i=0;i<100;i++)
{
System.out.println("");
}
setValueNull();
initValues(DefaultZeile,DefaultSpalte,DefaultKreis);
Refresh();
System.out.println("Zurückgesetzt auf Standarteinstellung!");
}//----RESET------//
else if (zufall == e.getSource()) //RANDOM BUTTON - Zufall -> Alle Steine setzen!
{//RAND START == WORK!
end=false;
getRandom(AnzFeld+1);
while (end==false)
{
if (!RasterArray[Rand].circle.isDraw()){ //Wenn draw=false/ Feld leer
RasterArray[Rand].circle.setDraw(true);
System.out.println("Kreis in Feld " + Rand + " gesetzt");
end=true;
}
else
{
getRandom(AnzFeld+1); //Damit keine Endlosschleife
if (isSetAll())
{
System.out.println("Alle Felder belegt!");
return;
}
}
getRandom(AnzFeld+1);
}
}//RAND END
else if (change == e.getSource()) //CHange Layout!
{//--------------CHANGE BUttON--------------------//
putZeile = Integer.parseInt(t1.getText()); System.out.println("Wert Zeile = " + putZeile);
putSpalte = Integer.parseInt(t2.getText()); System.out.println("Wert Spalte = " + putSpalte);
putKreis = Integer.parseInt(t3.getText()); System.out.println("Wert Kreise = " + putKreis);
initValues(putZeile,putSpalte,putKreis);
Refresh();
System.out.println("Werte geändert!");
}//--------------CHANGE BUttON--------------------//
else if (cleartext == e.getSource())
{
t1.setText("");
t2.setText("");
t3.setText("");
System.out.println("Textfelder geleert.");
for (int i=0;i<AnzFeld;i++){
System.out.println("Array " + i + " = "+RasterArray[i].circle.getMerk());
}
}
}
}//Listener ENDE
public static void main (String[] args) {
Main frame = new Main();
frame.setVisible(true);
}
}
Java:
//Klasse MyField ---------------------------------------------------
public class MyField extends JPanel{ //ist auch ein JPanel
public Circle circle;
public MyField(int id){ //MyField Konstruktor
super ();
circle = new Circle(id);
circle.setVisible(true);
this.setBackground(Color.BLACK);//3
this.setLayout( new GridBagLayout()) ;
/*
int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty,
int anchor, int fill,
Insets insets (Abstand N/O/S/W/, int ipadx, int ipady) {
*/
this.add(circle, new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(1,1,1,1), 0, 0));
}
public static void main (String[] args){
}
}
Java:
public class Circle extends JPanel implements MouseInputListener{ //EXTEND JPANEL!!!
private boolean draw = false;
private Color color = Color.BLUE;
private int id;
int Merk;
int temp;
boolean rel = false;
boolean Klick=false;
static int Stelle;
public void initReihe(boolean var){
if (var){
temp = Main.getValue();
}
}
public int getInternValue(){
this.Merk=Main.getValue();
return this.Merk;
}
public int getMerk(){
return this.Merk;
}
public boolean getRelease(){
return this.rel;
}
public void setRelease(boolean var){
this.rel=var;
}
public int gettheID(){
return this.id;
}
public void setKlick(){
Klick = true;
}
public void ValuePlus(){
Main.setValuePlus();
}
public void ValueMinus(){
Main.setValueMinus();
}
public int getVar(){
int var = Main.getValue();
return var;
}
public Circle(int id) {
this.Stelle=Main.getStelle();
this.id=id;
//setValue (1=++ 2=-- | x=getValue()
this.addMouseListener(this);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
if (isDraw()) {
setDraw(false);
//setKlick();
//Main.Position--;
} else {
setDraw(true);
Merk=Main.getValue();
Main.setValuePlus();
initReihe(true);
}
}
});
//this.setBackground(Color.MAGENTA); //innerstes Panel
}
//Methoden der Klasse Circle2
public boolean isDraw() {
return draw;
}
public void setDraw(boolean draw) {
this.draw = draw;
repaint();
}
public void setColor(Color color) {
this.color = color;
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(60, 60);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int fontSize = 20;
if (draw) {
g.setColor(color);
g.fillOval(getWidth()/4, getHeight()/4, getWidth()/2, getHeight()/2);
g.setFont(new Font("TimesRoman", Font.BOLD, fontSize));
g.drawString(""+temp, 0, fontSize);
initReihe(false);
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
//System.out.println("click : "+id);
if(isDraw()){
Main.setStelle();
Stelle=Main.getStelle();
}
//System.out.println("KORD: "+e.getPoint());
/*
System.out.println("drag id -> "+this.id);
Point pstart = e.getPoint();
System.out.println("Point start: "+pstart);*/
}
@Override
public void mouseReleased(MouseEvent e){
}
@Override
public void mouseEntered(MouseEvent e) {
/*if (getRelease()){
System.out.println("enter id: "+id);
setRelease(false);
}*/
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
}//Ende Circle2 Klassepackage Numbers;
Wäre sehr nett wenn jemand eine Idee hätte
Vielen Dank im Vorraus.