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.
Wie kommst Du denn an die Koordinaten? Aus einem Event heraus? Dann müsste event.getSource direkt (ohne Umweg über die Koordinaten) das entsprechende Objekt liefern.
Grundsätzlich geht das vtml. mit was wie http://java.sun.com/j2se/1.3/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt(java.awt.Component,%20int,%20int)
aber was auch immer du da vorhast: Mach' es anders! Es hört sich (wenn du nicht wirklich 100% weißt, was du das tust) ziemlich murksig an....
Es hört sich immernoch murksig an - genaugommen noch murksiger als vorher. Die Beschreibung ist etwas zu dünn, als dass man echte Verbesserungsvorschläge machen könnte, aber ... kannst du nicht ""irgendwie"" die Information Speichern, dass die Buttons O und Y in dieser Form "verbunden" sind?
also, wenn du da schon 100 buttons auf dem feld hast, dann wirst du die ja wohl in irgendeinem 2D-array abspeichern, und wenn du schon jeden einzelnen button über array ansprechen kannst, brauchst du dich mit den ganzen bescheuerten bildschirmkoordinaten nicht herumzuprügeln...
ich weiß auch warum ich das so mach und nicht anders ^^
Das muss so flexibel sein, weil ich keine Ahnung hab auf welches X der O Button übertragen wird, wüsst ich auf welchen das kommt, wär das auch gar kein Problem ... mein Problem ist einfach, dass ich nur die Koordinaten habe...
Ich hab da mal ein GridBagLayout genommen, weil das als einziges gepasst hat ... ich hab da zwar noch nicht so viel Erfahrung mit, aber das hat bis jetzt alles gut gepasst ... den einen Befehl noch und mein Programm ist fertig ^^
ey, das geht ab hier wie im chat^^
ja, aber koordinaten im array mit buttons sind ja wohl wesentlich verlässlicher als irgendwelche wüsten manipulationen mit bildschirmkoordinaten :!: [ausser deine buttons sind klumpenförmig und rennen alle chaotisch durch den bildschirm^^]
musste aber GradBagLayout sein, weil bei nem GridLayout bei mir bisher alle Felder gleichgroß waren und das geht da nicht.. die sind alle unterschiedlich groß
das Gitter war auch nur ein Ausschnitt
das ganze sieht so aus
LLLLLLLLLLLLLLL
LXXXXXXXXXXL
LXXXXXXXXXXL
LXXXXXXXXXXL
LXXXXXXXXXXL
LXXXXXXXXXXL
LXXXXXXXXXXL
L_B_B_B_B_B_L
L_B_B_B_B_B_L Die B Flächen sind wesentlich größer als die X Flächen ... zusätzlich ist das alles von 4 großen
LLLLLLLLLLLLLLL L-Flächen umgeben
dem array mit buttons ist die sichtbare breite der buttons aber ziemlich egal... da ist immer alles genau 32bit breit :meld:
ne, aber dürfte ich vielleicht mal erfahren was du da eigentlich tust :bae: ?
okay sehe jetzt den edit...
Ähm, na gut, dann hat das hier jetzt aber wohl kaum etwas mit gui-programmierung zu tun... also, nur im weitesten sinne^^ Du willst hier anscheinend buttons für irgendein pseudographisches spielchen einsetzen... oder ein neuartiges steuerungskonzept... Na gut...
Container bietet die Methode:
Code:
getComponentAt(x,y)
und auf das container an sich könntest du vom ActionListener des Butoons wie folgt zugreifen:
Code:
button.add(new ActionListener(){
public void actionPerformed(ActionEvent e){
((JComponent)(e.getSource())).getParent().getComponentAt(.???).irgendwasmachen();
}
}
Und da ich bei nem GridLayout bisher keine unterschiedlich große Flächen hinbekommen haben hab ich das GridBayLayout genommen, allerdings habe ich jetzt dieses Problem das es noch zu lösen gilt ... aber wie ? ^^
Soll ne Spiefläche sein für ne Art Strategiespiel ... deswegen überall die Buttons ... rundenbasiert und ein bisschen komplex ^^
Poste evtl. mal einen Screenshot, und beschreib dann ganz genau, WANN und WARUM die Beschriftung von WELCHEM Button auf WELCHEN anderen Button übertragen werden muss.
wasss??? :autsch: den letzten post hab ich jetzt gar nicht gerafft... :bahnhof:
ey, da gibts doch irgendwo einen chat der zu diesem forum hier gehört oda?
hey, wenn du es noch konkreter haben willst als auf der ersten seite dieses threads, dann musst du schon n bissl code hergeben, ich tipp das jetzt nicht alles selbst ein... aber irgendwie verstehe ich nicht mehr, was dir noch fehlt um das umzusetzen was du haben willst?
edit:
hast du auf die 1. seite "zitat: weiter oben" geschaut? ich hab da was editiert, da steht der code schon, wie du auf benachbarte buttons zugreifen kannst
public static void Einheitbewegen()
{
anfang=Ausgangsbutton.getLocation();
int i=0;
int j=0;
anfang.x=i;
anfang.y=j;
OU=Ausgangsbutton.getWidth();
LR=Ausgangsbutton.getHeight();
switch (Richtung)
{
case 'O': j=j-OU;
break;
case 'U': j=j+OU;
break;
case 'R': i=i+LR;
break;
case 'L': i=i-LR;
break;
}
Zielbutton=?;
// Zielbutton=(JComponent).getParent().getComponentAt(i,j); Hat das Programm nich gefressen :(
}
public static void Einheitbewegen()
{
anfang=Ausgangsbutton.getLocation();
int i=anfang.x;
int j=anfang.y;
OU=Ausgangsbutton.getHeight();
LR=Ausgangsbutton.getWidth();
switch (Richtung)
{
case 'O': j=j-OU;
break;
case 'U': j=j+OU;
break;
case 'R': i=i+LR;
break;
case 'L': i=i-LR;
break;
}
Zielbutton=(JComponent).getParent().getComponentAt(i,j); <------------------ Die Zeile
}
Ich hab ja die Koordinaten des Ziels und ich hab die Variable Zielbutton .. aber jetzt muss ich den Befehl von dir umformen, damit der geht ... da stimmt noch was nicht
oh mensch... ich sags nochmal: vorletzter post auf der ersten seite. da stehts. ich habs dazueditiert. schon vor langer zeit. aber seitdem hast du nicht auf die 1. seite geschaut. da stehts schon, ehrlich^^ genau die zeile...
Ich werfe hier nochmal das ein, was ich schon zuallererst gesagt habe: Was auch immer du vorhast: Mach' es anders!.
Ansonsten schau' ich morgen mal, wie weit ihr hier seid :wink:
Ich seh doch was da steht, ich habs mir angeguckt und versucht einzubauen, aber in der Zeile mit dem Pfeil ist ein Fehler ... ich hab das falsch eingebaut .... du hast das in den ActionListener implementiert ...
ich brauch das aber in einer ganz normalen Methode
Ich steh grad total aufm Schlauch wie ich das an der Stelle richtig implementier ^^
ich versuchs mal anders
ich weiß wo der Button O ist und hab ihn mit der Variable "Ausgangsbutton" markiert
ich weiß wo der Button Y ist, aber ich weiß nicht wie ich ihn mit der Variable "Zielbutton" markiere
Ich seh den Befehl ... ich kann den bloß nich umwandeln ...
@Marco13: nene, ist schon alles in ordnung, da scheint es echt nicht viel sinnvoller zu gehen, das alles hat nix mehr mit herkömmlichen GUIs zu tun, keine angst
@The-Forgotten: momentchen, ich bastle mal was, dauert evtl 10 min, bin gleich wida mit nem codebrocken zurück okay...
oi oi oi, enger zeitplan ey^^ :bae: sec, bin gleich fertig hoff ich mal...
whaa, :autsch: das mit dem JDialog will nicht klappen argh... kA, wenn du zeit bis morgen hast, könntest du mir vielleicht verzeihen, wenn ich mir hier so viel zeit lasse^^
ookay, nun ist es zwar eine halbe stunde später fertiggeworden als erhofft, aber immerhin^^ (sry, hab mich mit dem schais JDialog rumgeprügelt, es wollte niiicht :cry: )
also, das wäre imho die simpelste programmstruktur, die deine anforderungen erfült:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonGame extends JFrame implements ActionListener{
JButton[] buttons;
//rictungen
public static enum Direction{
LEFT, RIGHT, UP, DOWN;
}
private Direction getDirection(){
return Direction.values()[JOptionPane.showOptionDialog(null,
null,
"Richtung",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
Direction.values(),
Direction.values()[0])];
}
public ButtonGame(){
super("Spielchen mit JButtons");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(450,450);
this.getContentPane().setLayout(new GridLayout(10,10));
buttons=new JButton[100];
for(int i=0; i<buttons.length; i++){
buttons[i]=new JButton(""+(char)(Math.random()*50+70));
buttons[i].setBackground(new Color((int)(Math.random()*255),
(int)(Math.random()*255),
(int)(Math.random()*255)));
buttons[i].addActionListener(this);
this.getContentPane().add(buttons[i]);
}
this.setVisible(true);
}
//DER INTERESSANTE TEIL
public void actionPerformed(ActionEvent e) {
JButton origin=(JButton)e.getSource();
int x=origin.getX(), y=origin.getY();
switch(getDirection()){
case LEFT: x-=1; break;
case RIGHT: x+=origin.getWidth()+1; break;
case UP: y-=1; break;
case DOWN: y+=origin.getHeight()+1; break;
}
//die zugriffszeile
JButton target=(JButton)((JButton)e.getSource()).getParent().getComponentAt(x,y);
//swap labels (and colors)
String tempString=origin.getText();
origin.setText(target.getText());
target.setText(tempString);
Color tempColor=origin.getBackground();
origin.setBackground(target.getBackground());
target.setBackground(tempColor);
}
public static void main(String[] args){
JFrame f=new ButtonGame();
}
}
einfach kompilieren und guggen... Das alles war schonmal deswegen nicht umsonst, dass ich rausgefunden hab, dass du bei deinem switch() evtl auf die falschen buttons zugreifen könntest (vielleicht liegt es aber auch an der +-1 die ich überall eingefügt habe)
also, deinen code hab ich zwar nie zur gesicht bekommen, aber irgendwie erscheinen mir die vielen statischen zwischenspeicher-variablen recht überflüssig (solche sind in meinem code zB nicht vorhanden :bae: ) wäre es vielleicht einfacher ausschnitte aus diesem beispiel ein wenig an das bereits vorhandene programm anzupassen? ich meine, alles was du tun musst ist ja nur den entsprechenden actionListener einzufügen, und getDirection() auf die tasten umzubiegen die in deinem programm sonst irgendwo "erscheinen"...
zu den älteren codestücken:
Code:
(JComponent).getParent().getComponentAt(i,j);
was das sein sollte hab ich irgendwie gar nicht gerafft, das war einfach so falsch dass ich dachte du hättest dich vertippt^^ was soll das denn auch sein? Explizites Casting eines Punktoperators? LOL :lol:
wenn du das meintest, dann sorry wegen dem ganzen missverständnis:
also die Architektur davon gefällt mir nicht.
Wenn Du Dir den Text von Button O holst und ihn auf X transferierst ist das arg daneben. Du missbrauchst das GUI zur Datenhaltung.
Das klingt schonmal merksam...
Du solltest eigentlich die Daten in einer geeigneten Struktur speichern und auf Events reagieren, die widerrum mit den Datenstrukturen Logik ablaufen lassen und dann die Oberfläche "updaten".
Und nicht eine Komponente mittels Koordinaten "erfassen" und andere Komponenten "in der Nähe" der Koordinaten suchen um damit zu arbeiten.
der missbraucht hier gui elemente allgemein für irgendetwas total nicht-guimäßiges, das alles ist keinesfalls als sauberer code sondern lieber als dreckiger hack anzusehen :wink: