Random Butten erstellen ohne Container

Diskutiere Random Butten erstellen ohne Container im AWT, Swing, JavaFX & SWT Bereich.
Z

Z3R0-23

Hallo, ich hab hier ein Code und ich möchte gern das wenn ich denn Button Random drücke das ein zufälliger button einen Knopf bekommt, das einzige das man machen muss ist der Random button der rest geht schon bloß ich weiß nicht wie ich es machen soll
Java:
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.util.Random;
    
public class Raster extends JPanel  {
    
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public Raster(String title) {
    JFrame frame = new JFrame(title);
    
    //Fenster erzeugen
    frame.setSize(1000, 1000);
    frame.setLayout(new GridLayout(0, 6));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    //Buttons erzeugen   
        for(int i = 1; i < 37; i++)
        {
            JButton h = new JButton ("Test");
            frame.add(h);
            h.addActionListener(e -> actionPerformed(e, h));   
           }
        //Random Button auslöser
        JButton a = new JButton ("Random");
        frame.add(a);
        //a.addActionListener(i -> );
        
        frame.setVisible(true);
     }
    
    
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new Raster("Raster");
            }
        });
    }
    
    public void actionPerformed(ActionEvent e, JButton btn)
    {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        btn.setIcon(icon);
    }
}
 
L

lam_tr

Hallo,

ich kenne mich in Swing leider gar nicht aus, aber kann man nicht irgendwie so in die Richtung machen?

Code:
JButton a = new JButton ("Random");
frame.add(a);
a.addActionListener(i -> {
    // Index 36 ist dann wohl der Random Button
    Random r = new Random(35);
    int randomValue = r.nextInt();
    Button button = frame.getChildren().get(randomValue);
    button.setImage(imageKnopf);
});
Der Code ist nicht vollständig und auch nicht getestet. Ist nur eine Idee.
 
Z

Z3R0-23

Aber was spricht denn bitte gegen das Array
An sich nichts bloß ich wollte bei dem Random Button gern das auch das Icon erscheint und da ich neu bin in Java wusste ich nicht wie ich das umsetzen soll, ich versuche es jetzt mit einerm actionPerformed einmal für das Bild zu laden wenn ein Button gedrückt wird und eins dafür das ein random button gedrückt wird
Java:
    public Raster(String title) {
    JFrame frame = new JFrame(title);
    
    //Fenster erzeugen
    frame.setSize(1000, 1000);
    frame.setLayout(new GridLayout(0, 6));
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    //Buttons erzeugen   
        for(int i = 1; i < 37; i++)
        {
            JButton h = new JButton ();
            frame.add(h);
            h.addActionListener(e -> actionPerformed1(e, h));   
           }
        //Random Button auslöser
        JButton a = new JButton ("Random");
        frame.add(a);
        a.addActionListener(i -> actionPerformed2(i, a));
        frame.setVisible(true);
     }
    
    
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new Raster("Raster");
            }
        });
    }
    
    public void actionPerformed1(ActionEvent e, JButton btn)
    {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        btn.setIcon(icon);
    }
    
    public void actionPerformed2(ActionEvent i, JButton btn)
    {
        
    }
Hier bei actionPerformed2 überlege ich grade noch wie ich es jetzt mache
 
MoxxiManagarm

MoxxiManagarm

Dann mach statt buttons[new Random().nextInt(buttons.length)].doClick(); einfach das, was actionPerformed1 tut. Also

Java:
a.addActionListener(e -> {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        buttons[new Random().nextInt(buttons.length)].setIcon(icon);
});
 
mihe7

mihe7

Hier mal ein komplettes, lauffähiges Beispiel (lädt die Bilder von Wikimedia Commons):
Java:
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.Random;

import javax.imageio.*;
import javax.swing.*;

public class Test {
    private static final String WIKIMEDIA_BASE =
            "https://upload.wikimedia.org/wikipedia/commons/";

    private static final String HOURGLASS =
            WIKIMEDIA_BASE + "4/49/Hour_glass_clip_art.png";

    private static final String PAASHAAS =
            WIKIMEDIA_BASE + "e/ea/Paashaas.gif";

    private Random rand = new Random();
    private JButton[] buttons;
    private ImageIcon faceIcon;
    private ImageIcon backIcon;

    public void run() {
        loadIcons();
        createButtons();

        JButton randomButton = new JButton ("Random");
        randomButton.addActionListener(e -> showImageRandomly());

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(0, 6));

        for (JButton button : buttons) {
            frame.add(button);
        }
        frame.add(randomButton);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    private void loadIcons() {
        try {
            faceIcon = new ImageIcon(ImageIO.read(new URL(HOURGLASS))
                    .getScaledInstance(64, 64, Image.SCALE_FAST));

            backIcon = new ImageIcon(ImageIO.read(new URL(PAASHAAS))
                    .getScaledInstance(64, 64, Image.SCALE_FAST));
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(1);
        }
    } 

    private void createButtons() {
        ActionListener listener = e -> actionPerformed(e);

        buttons = new JButton[36];

        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton();
            buttons[i].setIcon(faceIcon);
            buttons[i].addActionListener(listener);
        }
    }

    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        button.setIcon(backIcon);
    }

    public void showImageRandomly() {
        buttons[rand.nextInt(buttons.length)].setIcon(backIcon);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Z

Z3R0-23

Dann mach statt buttons[new Random().nextInt(buttons.length)].doClick(); einfach das, was actionPerformed1 tut. Also

Java:
a.addActionListener(e -> {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        buttons[new Random().nextInt(buttons.length)].setIcon(icon);
});
also es hat geklappt damit denn Code auszufuhren bloß dann kommt ganze zeit fehler meldungen
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Raster.lambda$1(Raster.java:42)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6589)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6354)
    at java.desktop/java.awt.Container.processEvent(Container.java:2261)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4966)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2319)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4914)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4543)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4484)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2305)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4798)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue.access$600(EventQueue.java:97)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
 
Z

Z3R0-23

Hier mal ein komplettes, lauffähiges Beispiel (lädt die Bilder von Wikimedia Commons):
Java:
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.Random;

import javax.imageio.*;
import javax.swing.*;

public class Test {
    private static final String WIKIMEDIA_BASE =
            "https://upload.wikimedia.org/wikipedia/commons/";

    private static final String HOURGLASS =
            WIKIMEDIA_BASE + "4/49/Hour_glass_clip_art.png";

    private static final String PAASHAAS =
            WIKIMEDIA_BASE + "e/ea/Paashaas.gif";

    private Random rand = new Random();
    private JButton[] buttons;
    private ImageIcon faceIcon;
    private ImageIcon backIcon;

    public void run() {
        loadIcons();
        createButtons();

        JButton randomButton = new JButton ("Random");
        randomButton.addActionListener(e -> showImageRandomly());

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(0, 6));

        for (JButton button : buttons) {
            frame.add(button);
        }
        frame.add(randomButton);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    private void loadIcons() {
        try {
            faceIcon = new ImageIcon(ImageIO.read(new URL(HOURGLASS))
                    .getScaledInstance(64, 64, Image.SCALE_FAST));

            backIcon = new ImageIcon(ImageIO.read(new URL(PAASHAAS))
                    .getScaledInstance(64, 64, Image.SCALE_FAST));
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(1);
        }
    }

    private void createButtons() {
        ActionListener listener = e -> actionPerformed(e);

        buttons = new JButton[36];

        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton();
            buttons[i].setIcon(faceIcon);
            buttons[i].addActionListener(listener);
        }
    }

    public void actionPerformed(ActionEvent e) {
        JButton button = (JButton) e.getSource();
        button.setIcon(backIcon);
    }

    public void showImageRandomly() {
        buttons[rand.nextInt(buttons.length)].setIcon(backIcon);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
der Code will bei mir nicht starten er sagt er finden die Bilder nicht wenn ich den Fehler Code richtig verstanden hab
 
Z

Z3R0-23

Hi, ich habe jetzt mal bisschen herum geschraubt und überlegt wie man das machen könnte, da bin ich auf die idee gekommen das random extra zu machen also nicht mitten in dem ActionListing und dann später das random mi den Button anzusteuern bloß ich weiß grade nciht wie ich es verbinden soll also das random un die Button
Java:
//Buttons erzeugen
        for(int i = 1; i < 37; i++)
        {
            JButton h = new JButton();
            frame.add(h);
            h.addActionListener(e -> actionPerformed1(e, h));   
           }
        //Random Button auslöser
        //Geht nicht fehlermeldung
        JButton a = new JButton ("Random");
        frame.add(a);
        a.addActionListener(e -> {
            // create random object
            Random ran = new Random();
            int nxt = ran.nextInt(37);
 
Z

Z3R0-23

Dann mach statt buttons[new Random().nextInt(buttons.length)].doClick(); einfach das, was actionPerformed1 tut. Also

Java:
a.addActionListener(e -> {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        buttons[new Random().nextInt(buttons.length)].setIcon(icon);
});
Also bei mir klappt das nicht der sucht dann immer nach Button[], und wenn ich Button[] nimmt er es an aber wenn ich dann denn Random Button drücke kommen wieder fehler meldungen
 
Z

Z3R0-23

Also ich hab es hinbekommen, ich schicke gleich mal denn Code hier rein
 
Z

Z3R0-23

Der Code läuft ohne Probleme zumindes hab ich keine Bemerkt
Java:
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.util.Random;

public class Raster2 extends JPanel {
    public JButton[] buttons = new JButton[36];
    public JButton a = new JButton ("Random Button");
    public Raster2(String title) {
        JFrame frame = new JFrame(title);

        //Fenster erzeugen
        frame.setSize(1000, 1000);
        frame.setLayout(new GridLayout(0, 6));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Buttons erzeugen
        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton();
            frame.add(buttons[i]);
            int finalI = i;
            buttons[i].addActionListener(e -> System.out.println("Button " + (finalI + 1) + " was activated."));
        }
        //Random Button auslöser
        frame.add(a);
        a.addActionListener(e -> actionPerformed1(buttons[35]));
        frame.setVisible(true);
     }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Raster2("Raster"));
    }
    public void actionPerformed1(JButton btn)
    {
        Image image = new ImageIcon(getClass().getResource("punkt.jpg")).getImage();
        ImageIcon icon = new ImageIcon(image.getScaledInstance(btn.getWidth(),btn.getHeight(),Image.SCALE_FAST ));
        buttons[new Random().nextInt(buttons.length)].setIcon(icon);
    }
}
 
Thema: 

Random Butten erstellen ohne Container

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben