Zusätzliche Fenster mit Rastergitter in JFrame einfügen


#1

Hallo zusammen,

ich würde gerne auf mein JFrame-Fenster ein weiteres Fenster platzieren.
Dieses zusätzliche Fenster soll genauso ausehen wie der “Color chooser” von java, also ein Rastergitter.
Nur möchte ich, dass das Gitter keine Farben sondern Objekte zum anklicken enthält.

Wie mache ich das?

Was kann ich da verwenden?

MfG


#2

Willkommen hier im Forum,

hast du mal den bisherigen Code des JFrame s ?

Möchtest du das Gitter mit anklickbaren Icons selber erstellen, oder suchst du dafür eine Lib.?

Vermutlich lässt sich der “Color chooser” nicht so weit anpassen, das er etwas komplett anderes macht.


#3

Hallo,

beim JFrame gibt es nicht viel Code.
Ich habe nur die Größe, die Position und ein paar kleinigkeiten festgelegt.

Ob ich das Gitter selber programmiere, hängt davon ab wie komplex das ganze ist.

Ich habe mal ein JPanel auf dem JFrame platziert.
Danach wollte ich ein JLabel-Array erzeugen mit einen Rahmen pro Kästchen.
Diese kleinen Kästchen wollte ich dan auf dem JPanel platzieren.
War nur mal ein Versuch, glaub eh nicht dass das so funktionieren wird.

Den Color chooser anpassen, wird wohl nicht so einfach gehen.

Wie würdest Du das ganze angehen??

MfG


#4

Hm, hier wurde so etwas Ähnliches gefragt und auch selber gemacht: https://stackoverflow.com/a/36391267 .

Also ich würd das selber machen. Du nimmst einen Container/Component, fügst ein GridLayout hinzu, fügst JLabel mit Icon hinzu, vielleicht soll es anklickbar sein, dann fügst du ActionListener hinzu.


#5

Ein paar möglicherweise relevante Fragen:

  • Was soll in diesen Kästchen dargestellt werden? Sollten das kleine Buttons sein?
  • Wer legt fest, wie viele Gitterzellen es gibt (Zeilen x Spalten)?
  • Wer legt fest, wie groß eine Gitterzelle sein soll?

Der nächstliegende/einfachste Ansatz wäre vermutlich ein GridLayout mit JButton-Objekten drin. Das wäre dann ziemlich trivial…

JPanel createPanel(int rows, int cols) 
{
    JPanel panel = new JPanel(new GridLayout(rows, cols));
    for (int r=0; r<rows; r++) 
    {
        for (int c=0; c<cols; c++) 
        {
            int row = r;
            int col = c;
            JButton b = new JButton(row+","+col);
            b.addActionListener(e -> 
            {
                System.out.println("Clicked at "+row+", "+col);
            });
            panel.add(b);
        }
    }
    return panel;
}

(ungetestet), aber natürlich kann es sein, dass irgendwelche tweaks nötig sind, damit es “genau so ist, wie es sein soll”…


#6

Jae, der Vorschlag von Marco13 funktioniert:

        JFrame jf = new JFrame("Provide a title");
        jf.add(getButtonPanel(10, 8, (ActionEvent e) -> {
            JButton jb = (JButton) e.getSource();
            System.out.println(jb.getText() + " pressed");
        }));
        jf.setSize(800, 800);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }

    static JPanel getButtonPanel(int w, int h, ActionListener al) {
        JPanel jp = new JPanel(new GridLayout(h, w, 5, 5));
        for (int j = 0; j < h; j++) {
            for (int k = 0; k < w; k++) {
                JButton jb = new JButton(j + "," + k);
                jb.setBackground(Color.white);
                jb.addActionListener(al);
                jp.add(jb);
            }
        }
        return jp;
    }

Für ActionListener könnte auch null übergeben werden, anstatt Text könnte auch Icon übergeben werden.

So schaut es:


#7

Hallo zusammen,

ich möchte in den eizelnen Kästchen kleine Objekte darstellen die man anklicken kann und in einem darüberliegenden Fenster platzieren kann.

Die Kästchen haben immer die gleiche Größe.

Ich werde das heute mal so probieren, wie Ihr das geschrieben habt.

Danke!


#8

Eine Frage noch,

Wie kann ich nun das Objekt mit der Maus angreifen und am JFrame platzieren?

Gibt es dafür schon eine fertige Klasse?

MfG


#9

Hmgl… läuft das auf ein https://de.wikipedia.org/wiki/15-Puzzle raus?


#10

Nein, es geht um einen Level-Editor.


#11

Und “am JFrame” heißt hier: Irgendwo in den Gitterzellen? Wo kommt das Objekt her? Sowas wie https://docs.oracle.com/javase/tutorial/uiswing/dnd/intro.html kann in den Tiefen ein bißchen fummelig sein, aber vermutlich geht’s ja um etwas einfacheres…?


#12

Ich habe nun mal ein JPanel voll mit Buttons, das JPanel ist am JFrame platziert.
Wenn ich nun einen Button anklicke, soll an meiner Mausspitze das entsprechende Objekt liegen.
Dann möchte ich das Objket auf dem JFrame platzieren können und zwar mit einem Mausklick.

Das ist der Plan.

MfG


#13

Ahja, “am Frame” ist wohl östereichisch für “im Frame” oder “auf dem Frame”. Also ich nehme jetzt an, dass du (woanders) dann irgendwelche Buttons haben willst mit “Wand”, “Gras”, “Gegner”, “Schatztruhe”, und diese Items im Level platzieren willst. Oder, alternativ, dass in diesem Gitter schon Objekte liegen wie etwa eine “Schatztruhe”, und du die mit einem Klick auf den Button auswählen und woanders wieder ablegen können willst.

Was ist da dann der wichtigste Punkt? Die reine Funktionalität davon ist mit einer handvoll Zeilen erledigt. Das schwierigste wäre da, dafür zu sorgen, dass das Item (sichtbar) “am Mauszeiger klebt”, wie man es manchmal bei Drag+Drop-Operationen sieht. (Spontan wüßte ich nicht, wie das geht, und bin nicht mal 100% sicher ob das überhaupt geht…)


#14

OpenGL wäre für sowas die geeigneterere Wahl, da ist aber das Item-/Icon-Menu schwierigerer zu schreiben.

Ein schöner/lustiger (oder gar animierter) Mauszeiger ist tief im System verankert, Java s Standard-Library bietet das AFAIK nicht an.

######Edit: Ich hab nachgeschaut, der Komparativ in schwacher Flexion im Nominativ singular feminin von ‘geeignet’ wäre nur der unschnöde ‘geeignetere’… das wiederholt steigern zu wollen, ist ja auch Nonsens. :wink:


#15

Natürlich kannst du deinen eigenen Curser implementieren


damit könntest du indirekt das bewerkstelligen was du vorhast.


#16

Die cursor-Frage ist eigentlich nur ein Detail, aber ich erinnere mich, dass auf einigen OSes die Größe des Cursors auf 32x32 beschränkt war. Heutzutage könnte das aber durchaus anders sein.


#17

Ja aber ich wollte nur auch eine Lösung dafür bieten, da du meintest, dass du nicht sicher bist, ob es überhaupt geht.
falls diese 32x32 Beschränkung noch immer existiert, kann man das ganze auch noch mit einem MouseMotionListeners jenes Panels lösen auf die die Objekte anschließend abgelegt werden sollten, bzw. halt mit einem MouseMotionListener des gesamten JFrames.

Das dieser Listeners wird immer aufgerufen (wie der Name schon sagt) wenn die Maus über dem JPanel/JFrame bewegt wird. nun könnte mann mit einem eigenen JPanel als glass pane des JFrames ein Image an der stelle an der das MouseEvent aufgetreten ist zeichnen (paitComponent()).

Die kursiven Wörter wären dann Suchbegriffe für die bevorzugte Suchmaschine.

Sobald dann das Object mit einem MouseClick abgelegt wird, kann zeichnet man einfach nichts mehr auf der glass pane

Das Aufnehmen des Objects funktioniert wie von @Marco13 und @CyborgBeta beschrieben mit einem GridLyout und z.B. JButtons und einem ActionListener.

Hier hab ich schnell ein Bsp gefunden wo ein Roter punkt and die Mausposition gezeichnet wird.
https://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html


#18

Danke erstmals für die super Hilfe!!

Ich werde das mal versuchen.

Vielen Dank!

Meld mich wieder.

MfG


#19

Für’sProtokoll:
Das turorial gibts auf für FX

http://docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm


#20

Danke für die Hilfe.

MfG