Metoda paintComponent nie jest wywoływana

0

Witam,
zaczynam bawić się w Javie i taka prosta sprawa jak metoda paintComponent() mnie przeprasta. Proszę o małą pomoc :)

class etapdrugi extends JFrame implements ActionListener, MouseListener
{
        Dimension roz = Toolkit.getDefaultToolkit().getScreenSize();
        int w = (roz.width-1024)/2;
        int h = (roz.height-768)/2;
        JPanel panel = new JPanel();
        JButton kl, kl1, kl2, kl3, kl4;
        private String nazwa;
        int x = 0, x1 = 0, x2 = 0, x3 = 0;
        int y = 0, y1 = 0, y2 = 0, y3 = 0;
        int current_point = 0;
        boolean a = true;
    public etapdrugi()
    {
        super("tutorial");
        MatteBorder matte = new MatteBorder(2, 2, 2, 2, Color.red);
   
        panel.setBackground(Color.BLUE);
        panel.setLayout(null);
        setSize(1024,768);
        this.setLocation(w,h);        
        add(panel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        panel.add(kl = new JButton("Hel"));
        kl.setBounds(820, 384, 70, 70);
        kl.setBorder(matte);
        panel.add(kl1 = new JButton("Wodór"));
        kl1.setBounds(890, 384, 70, 70);
        kl1.setBorder(matte);
        panel.add(kl2 = new JButton("Tlen"));
        kl2.setBounds(820, 454, 70, 70);
        kl2.setBorder(matte);
        panel.add(kl3 = new JButton("Osm"));
        kl3.setBounds(890, 454, 70, 70);
        kl3.setBorder(matte);
        panel.add(kl4 = new JButton("Połączenie"));
        kl4.setBounds(820, 524, 140, 70);
        kl4.setBorder(matte);
        kl.addActionListener(this);
        kl1.addActionListener(this);
        kl2.addActionListener(this);
        kl3.addActionListener(this);
        kl4.addActionListener(this);
        panel.addMouseListener(this);
        setResizable(false);
        setVisible(a);
    }

        @Override
    public void actionPerformed(ActionEvent e){
    nazwa = ((JButton) e.getSource()).getText();
    }
    
        @Override
    public void mouseClicked(MouseEvent e) {
        if(current_point == 0){
        x = e.getXOnScreen();
        y = e.getYOnScreen();
        }
        else if(current_point == 1){
        x1 = e.getXOnScreen();
        y1 = e.getYOnScreen();
        }
        current_point++;
        System.out.println("nazwa to " +nazwa);
        System.out.println("x " +x);
        System.out.println("x1 " +x1);
        System.out.println("cp " +current_point);
        if(current_point == 2){
        current_point = 0; 
        }
    }
    
        @Override
    public void mouseEntered(MouseEvent e) {}
        @Override
    public void mouseExited(MouseEvent e) {}
        @Override
    public void mousePressed(MouseEvent e) {}
        @Override
    public void mouseReleased(MouseEvent e) {}

        
    protected void paintComponent(Graphics g){
        super.paintComponents(g);
        FontMetrics fm = g.getFontMetrics();
        double textWidth = fm.getStringBounds("Hel", g).getWidth();
        Graphics2D g2d = (Graphics2D) g;
        switch(nazwa){
            case "Hel":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Hel", (int)(x - w + textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                System.out.println(x);
                System.out.println(x1);
                break;
            case "Wodór":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Wodór", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            case "Tlen":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Tlen", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            case "Osm":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Osm", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            //case "Połączenie":
                //g2d.setColor(Color.red);
                //g2d.drawLine(x - w, y - h, x1 - w, y1 - h);
                //break;
        }
    }
}
0

wstawiaj kod w znacznikach kodu.

i jeśli mogę coś doradzić to jeżeli zaczynasz naukę z GUI poczytaj o JavaFX a nie swing czy tam AWT

Pozdrawiam

0

Pierwsze co rzuciło mi się w oczy, to brak '@Override' nad metodą 'paintComponent()'.

0

Jak wklejam '@Override' wyskakuje błąd.

0

A do JavaFX zajrzę, ale nieco później.

0

problem masz w tym że chcesz wywołać paintComponent na klasie która dziedziczy po JFrame, gdybyś chciał wywołać paintComponent w klasie dziedziczącej po JPanel wszystko by ładnie działało

0

Zmieniłem na to, że klasa dziedziczy po JPanel i jedyną zmianą było wprowadzenie '@Override' nad metodą paintComponent().

0

Metoda paintComponent musi być public.
Nauka na przyszłość, jeśli po dopisaniu adnotacji

@Override

wyskakuje błąd, to znaczy, że źle napisałeś sygnaturę: zła nazwa metody, złe argumenty, zła specyfikacja dostępu.

0

Po zmianach kod wygląda następująco i dalej nic szczególnego się nie dzieje.

class etapdrugi extends JPanel implements ActionListener, MouseListener
{
        Dimension roz = Toolkit.getDefaultToolkit().getScreenSize();
        int w = (roz.width-1024)/2;
        int h = (roz.height-768)/2;
        JPanel panel = new JPanel();
        JButton kl, kl1, kl2, kl3, kl4;
        private String nazwa;
        int x = 0, x1 = 0, x2 = 0, x3 = 0;
        int y = 0, y1 = 0, y2 = 0, y3 = 0;
        int current_point = 0;
        boolean a = true;
    public etapdrugi()
    {
        //super("tutorial");
        MatteBorder matte = new MatteBorder(2, 2, 2, 2, Color.red);
        JFrame ramka = new JFrame();
        panel.setBackground(Color.BLUE);
        panel.setLayout(null);
        ramka.setSize(1024,768);
        ramka.setLocation(w,h);        
        ramka.add(panel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        panel.add(kl = new JButton("Hel"));
        kl.setBounds(820, 384, 70, 70);
        kl.setBorder(matte);
        panel.add(kl1 = new JButton("Wodór"));
        kl1.setBounds(890, 384, 70, 70);
        kl1.setBorder(matte);
        panel.add(kl2 = new JButton("Tlen"));
        kl2.setBounds(820, 454, 70, 70);
        kl2.setBorder(matte);
        panel.add(kl3 = new JButton("Osm"));
        kl3.setBounds(890, 454, 70, 70);
        kl3.setBorder(matte);
        panel.add(kl4 = new JButton("Połączenie"));
        kl4.setBounds(820, 524, 140, 70);
        kl4.setBorder(matte);
        kl.addActionListener(this);
        kl1.addActionListener(this);
        kl2.addActionListener(this);
        kl3.addActionListener(this);
        kl4.addActionListener(this);
        panel.addMouseListener(this);
        panel.repaint();
        ramka.setResizable(false);
        ramka.setVisible(true);
    }

        @Override
    public void actionPerformed(ActionEvent e){
    nazwa = ((JButton) e.getSource()).getText();
    
    }
    
        @Override
    public void mouseClicked(MouseEvent e) {
        if(current_point == 0){
        x = e.getXOnScreen();
        y = e.getYOnScreen();
        repaint();
        }
        else if(current_point == 1){
        x1 = e.getXOnScreen();
        y1 = e.getYOnScreen();
        }
        current_point++;
        System.out.println("nazwa to " +nazwa);
        System.out.println("x " +x);
        System.out.println("x1 " +x1);
        System.out.println("cp " +current_point);
        if(current_point == 2){
        current_point = 0; 
        }
    }
        @Override
    public void mouseEntered(MouseEvent e) {}
        @Override
    public void mouseExited(MouseEvent e) {}
        @Override
    public void mousePressed(MouseEvent e) {}
        @Override
    public void mouseReleased(MouseEvent e) {}
        @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        FontMetrics fm = g.getFontMetrics();
        double textWidth = fm.getStringBounds("Hel", g).getWidth();
        Graphics2D g2d = (Graphics2D) g;
        switch(nazwa){
            case "Hel":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Hel", (int)(x - w + textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                System.out.println(x);
                System.out.println(x1);
                break;
            case "Wodór":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Wodór", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            case "Tlen":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Tlen", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            case "Osm":
                g2d.setColor(Color.black);
                g2d.fillOval(x - w, y - h, 80, 80);
                g2d.setColor(Color.white);
                g2d.drawString("Osm", (int)(x - w - textWidth/2),(int) (y - h + fm.getMaxAscent() / 2));
                break;
            //case "Połączenie":
                //g2d.setColor(Color.red);
                //g2d.drawLine(x - w, y - h, x1 - w, y1 - h);
                //break;
            }
        }
  
    }
 
0

Pokaż jeszcze kod klasy z metodą main.

Poza tym kod jest błędny - nie da się go skompilować, zatem nie wiesz czy on działa, czy nie. Błędem jest

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

, zamień na ramka.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//a jeszcze lepiej na
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Zmień też
```java
super.paintComponents(g);

na
super.paintComponent(g);

Kod wstawiaj w znaczniki `<code class="java"></code>`.
0

w klasie dziedziczącej po JPanel nie ma czegoś takiego jak

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

taka metoda istnieje w klasach dziedziczących po JFrame

Tworzenie JFrame na a panelu hmmm... ciekawe podejście,

Wywal obsługę zdarzeń do oddzielnych klas - znacznie poprawi to czytelność kodu

kolejna sprawa jak ma działąć painComponent skoro jego tworzysz dla klasy dziedziczącej po JPanel a obsługę zdarzeń dajesz do pola

JPanel panel

a następnie tego pola nigdzie nie dodajesz.

tutaj masz pisany na kolanie przykład wykorzystania metody paintComponent i myszki

klasa Panel:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * Created by Rafał on 08.11.2016.
 */
public class Panel extends JPanel {
    private int x;
    private int y;

    public Panel() {
        addMouseListener(new EventMouse());
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);

        drawOval(g, x, y, 20, 20);
        }

    public void drawOval(Graphics g, int x, int y, int xx, int yy){
        g.setColor(Color.RED);
        g.fillOval(x, y, xx, yy);
    }

    class EventMouse extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            x = e.getX();
            y = e.getY();

            repaint();
        }
    }
}

klasa Okno

import javax.swing.*;
import java.awt.*;

/**
 * Created by Rafał on 08.11.2016.
 */
public class Okno extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Okno okno = new Okno();
                okno.add(new Panel());
                okno.setSize(500,500);
                okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                okno.setVisible(true);
            }
        });
    }
}

edit1.
w jakim IDE piszesz że nie wywala Ci "podstawowych" błędów? bo to jest podejrzane że ide nie wyłapało błędu przy

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
0

Dziękuje bardzo za pomoc juz teraz działa. Jak zrobić, aby to okno było tylko jednym z wielu wyskakujących po wciśnięciu odpowiedniego klawisza w menu ? W klasie głównej z funkcją Main() zrobić menu, a później po kolei dodawać do poszczególnych implementację klas z każdym oknem ?

0

Teraz już pieknie rysuje tylko strasznie sie krzaczy. W lewym górnym rogu okna wyświetlają się przyciski w dziwnej kofiguracji oraz błąd " Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException"

package chemik;
import javax.swing.*;
import java.awt.*;
import javax.swing.border.MatteBorder;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class Tutorial extends JFrame{   
    Dimension roz = Toolkit.getDefaultToolkit().getScreenSize();
    int w = (roz.width-1024)/2;
    int h = (roz.height-768)/2;
    MatteBorder matte = new MatteBorder(2, 2, 2, 2, Color.red);
    
    public Tutorial(){
        okienko();
    }
    
    private void okienko(){
        add(new Drugi());
        setSize(1024, 768);
        setLocation(w,h);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    
public class Drugi extends JPanel implements ActionListener{
       JButton kl, kl1, kl2, kl3, kl4;
       JButton klawisze[] = {kl, kl1, kl2, kl3, kl4};
       int pozycjax[] = {820, 890, 820, 890, 855};
       int pozycjay[] = {384, 384, 454, 454, 524};
       String nazwy[] = {"Hel", "Wodór", "Osm", "Tlen", "Połączenie"};
       private int x;
       private int y; 
       String nazwa;
       
       public Drugi(){
           this.addMouseListener(new EventMouse());
           this.menu();
       }
       
       public void menu(){
           setLayout(null);
           for(int i=0; i<4; i++){
           klawisze[i] = new JButton(nazwy[i]); 
           klawisze[i].setBounds(pozycjax[i], pozycjay[i], 70, 70);
           klawisze[i].setBorder(matte);
           add(klawisze[i]);
           klawisze[i].addActionListener(this);
        }
    }
       
    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        switch(nazwa){
            case "Hel":
                drawOval(g, x, y, 70, 70);
                break;
            case "Wodór":
                drawOval(g, x, y, 70, 70);
                break;
            case "Tlen":
                drawOval(g, x, y, 70, 70);
                break;
            case "Osm":
                drawOval(g, x, y, 70, 70);
                break;
            //case "Połączenie":
                //g2d.setColor(Color.red);
                //g2d.drawLine(x - w, y - h, x1 - w, y1 - h);
                //break;
        }
    }
   
       @Override
    public void actionPerformed(ActionEvent e){
    nazwa = ((JButton) e.getSource()).getText();
    }
    
    public void drawOval(Graphics g, int x, int y, int xx, int yy){
        g.setColor(Color.RED);
        g.fillOval(x, y, xx, yy);
    }
    
    class EventMouse extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            x = e.getX();
            y = e.getY();
            repaint();
        }
    }
}   
}
0

wytłumacz mi proszę jakim cudem jesteś w stanie ten kod w ogóle odpalić?

0

Mam wywołanie klasy Tutorial w klasie w innym pliku

0

W tej klasie jest wywołana, a ta z kolei w jeszcze innej.

/*
 * 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 chemik;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.EventQueue;

public class menu extends JFrame{
    public menu(){
        super("Chemik");
        getContentPane().setBackground(Color.RED);
        setSize(1024,768);
        Dimension roz = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (roz.width-1024)/2;
        int y = (roz.height-768)/2;
        setLocation(x,y);
        setLayout(null);
        JButton start=new JButton("Start");
        JButton tutorial=new JButton("Tutorial");
        JButton info=new JButton("Info");
        JButton uo=new JButton("Układ okresowy");
        add(start);
        add(tutorial);
        add(info);
        add(uo);
        start.setBounds(462,460,110,50);
        tutorial.setBounds(462,525,110,50);
        info.setBounds(899,10,100,30);
        uo.setBounds(899,50,100,60);
        start.addActionListener(new START());
        tutorial.addActionListener(new TUTORIAL());
        info.addActionListener(new INFO());
        uo.addActionListener(new UO());
	setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    class START implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    
     }
    }

    class TUTORIAL implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        EventQueue.invokeLater(new Runnable() 
        {
            @Override
            public void run() 
             {
                new Tutorial();
             }
	});
     }
    }
    
    class INFO implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
    
     }
   }
    
    class UO implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        EventQueue.invokeLater(new Runnable() 
        {
			@Override
			public void run() 
                        {
				new układokresowy();
                        }
	});
     }
    }
}

package chemik;

import java.awt.EventQueue;

public class Chemik {

   
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() 
        {
            @Override
		public void run() 
                {
		  new menu();
                }
	});
    }
    
}

Problemem pozostało tylko, że jestem głupi i prostej rzeczy zrobić nie umiem :) oraz wyskakujące w lewym górnym rogu przyciski

0

to że dwa przyciski (JButton) wyświetlają Ci się w prawym górnym rogu to jest hmm... Twoja wina bo im tam każesz

 info.setBounds(500,10,100,30);
 uo.setBounds(500,50,100,60);

co do błędu

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

w następnej linijce błędu masz podane która linia kodu go wywołuje i jest (bynajmniej u mnie) nią ta linia kodu

switch(nazwa){

i oznacza to mniej więcej tyle że sprawdzasz zmienną "nazwa" która w danym momencie jest null

dzieje się tak dlatego ponieważ gdy odpadasz Tutorial to jest wywoływana metoda paintComponent a w tym momencie nazwa jest pusta.

albo dodaj warunek przez switch

if (nazwa != null)

albo zadeklaruj wstępnie ową nazwe np.

String nazwa = "Hel";
0

Z błędem poradziłem sobie wcześniej na zasadzie prób i błędów, a przyciski w prawym górnym rogu mają być faktycznie w oknie klasy menu. Natomiast w oknie klasy Tutorial w lewym górnym rogu nic nie wstawiałem i nie widzę by coś było tam wstawione, bo nic tam nie ma być. Zaraz po włączeniu okna pojawia się w tym miejscu kółko, które ma być wyświetlane w miejscu kliknięcia myszą, a po kliknięciu zamienia się na przycisk, którego nazwa zmienia się w zależności, który z tych właściwych przycisków został wciśnięty.

0
  1. Kółko w lewym górnym oknie Tutoriala pojawia się, bo pewnie w wierszu 36 napisałeś
String nazwa = "Hel";

zmień na

String nazwa = "";

to się kółko nie będzie pojawiać.

  1. Naprawdę chcesz by zamknięcie okna tutoriala kończyło program? Zamień (w wierszu 24)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

na

setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  1. W oknie Tutoriala rysujesz kółka, ale tylko jedno. Nowe kółko zastępuje stare - jeśli nie wierzysz, to zminimalizuj okno Tutoriala, a potem przywróć. Ma być tylko jedno kółko?

  2. Jeśli użytkownik zamknie Tutorial, a potem ponownie otworzy, to ma się pojawić puste okno czy wypełnione tym co poprzednio użytkownik wyklikał?

0

Miało to wyglądać w ten sposób, że kliknięcie na przycisk pobiera nazwę pierwiastka, która ma być wyświetlona w środku kółka lub obok. Ponowne kliknięcie na interesujący gracza klawisz powduje pojawienie się nastepnego kółka w miejscu kliknięcia myszą. Następne pojawienie się kółka ma nastąpić dopiero po ponownym wybraniu pierwiastka i jego miejsca na ekranie.

0

Domyślam się, że Twój post dotyczy punktu 3. Musisz przebudować program, stworzyć kolekcję obiektów złożonych z kółka i tekstu, a w metodzie paintComponent rysować w pętli wszystkie obiekty z kolekcji.

0

Przerobiłem i działa tak samo :)
Tylko dalej jest problem z wyświetlającymi się obrazami przycisków w miejscu gdzie nie powinno ich w ogóle być. Jak wyeliminować znikanie kółek po zminimalizowaniu ekranu ?

0

Jak wyeliminować znikanie kółek po zminimalizowaniu ekranu ?

Mój poprzedni post był właśnie temu poświęcony.

Przerobiłem i działa tak samo

Co przerobiłeś i co działa tak samo?

Tylko dalej jest problem z wyświetlającymi się obrazami przycisków w miejscu gdzie nie powinno ich w ogóle być

Skoro nie powinno ich być, to po co piszesz kod, który je tam umieszcza?

       public void menu(){
           setLayout(null);
           for(int i=0; i<4; i++){
           klawisze[i] = new JButton(nazwy[i]); 
           klawisze[i].setBounds(pozycjax[i], pozycjay[i], 70, 70);
           klawisze[i].setBorder(matte);
           add(klawisze[i]);
           klawisze[i].addActionListener(this);
        }

Moja delikatna sugestia, jesteś na razie na poziomie HelloWorld, zrezygnuj z pisania tak ambitnego programu.

0
int pozycjax[] = {820, 890, 820, 890, 820, 890};
int pozycjay[] = {384, 384, 454, 454, 524, 524};

Wiem gdzie i jak je dodaje. Nie wiem tylo czemu po kliknięciu myszą pojawiają się punkcie (0,0).

0

Bo napisałeś zły kod. W kodzie, który zamieściłeś na forum tak się nie dzieje.

0

Dmyśliłem, że w kodzie coś jest nie tak i nie potrafię sobie z tym poradzić

0

Ja sobie tym bardziej nie poradzę, skoro nie znam kodu.

0

Posłuchałbym Twojej rady, żeby dać sobie spokój, ale niestety muszę go zrobić jako projekt na zajęcia.

package chemik;
import javax.swing.*;
import java.awt.*;
import javax.swing.border.MatteBorder;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;


public class tutorial extends JFrame{   
    Dimension roz = Toolkit.getDefaultToolkit().getScreenSize();
    int w = (roz.width-1024)/2;
    int h = (roz.height-768)/2;
    MatteBorder matte = new MatteBorder(2, 2, 2, 2, Color.red);
    
    public tutorial(){
        okienko();
    }
    
    private void okienko(){
        add(new Drugi());
        setSize(1024, 768);
        setLocation(w,h);
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setVisible(true);
    }
    
public class Drugi extends JPanel implements ActionListener{
       JButton kl, kl1, kl2, kl3, kl4, kl5;
       JButton klawisze[] = {kl, kl1, kl2, kl3, kl4, kl5};
       int pozycjax[] = {820, 890, 820, 890, 820, 890};
       int pozycjay[] = {384, 384, 454, 454, 524, 524};
       String nazwy[] = {"Hel", "Wodór", "Osm", "Tlen", "Połączenie", "Czyszczenie"};
       JPanel l = new JPanel();
       List<ksztalty> kszt;
       private int x;
       private int y; 
       String nazwa = "";
       String cos;
       
       public Drugi(){
           this.addMouseListener(new EventMouse());
           this.menu();
           kszt = new ArrayList<>();
           kszt.add(new ksztalty(x, y, 70, 70));
       }
       
       public void menu(){
           setLayout(null);
           for(int i=0; i<6; i++){
           klawisze[i] = new JButton(nazwy[i]); 
           klawisze[i].setBounds(pozycjax[i], pozycjay[i], 70, 70);
           klawisze[i].setBorder(matte);
           add(klawisze[i]);
           klawisze[i].addActionListener(this);
        }
    }
       
    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        System.out.println(nazwa);
        switch(nazwa)
        {
            case "":
                break;
                
            case "Hel":
                for(ksztalty k: kszt){
                k.drawOval(g, x, y, 70, 70);
                k.drawString(g, nazwa, x, y);
                }
                nazwa = "";
                break;
                
            case "Tlen":
                nazwa = "";
                break;
                
            case "Czyszczenie":
                break;
        }
    }
   
       @Override
    public void actionPerformed(ActionEvent e){
    nazwa = ((JButton) e.getSource()).getText();
    }
        
           
    class EventMouse extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            x = e.getX();
            y = e.getY();
            repaint();
        }
    }
    
    class ksztalty {
        int x, y;
        int x1, y1;
        public ksztalty(int x, int y, int x1, int y1){
           this.x = x;
           this.y = y;
           this.x1 = x1;
           this.y1 = y1;
        }
        
        public void drawOval(Graphics g, int x, int y, int xx, int yy){
        g.setColor(Color.RED);
        g.fillOval(x, y, xx, yy);
        }
        
        public void drawString(Graphics g, String str, int x, int y){
        g.setColor(Color.BLACK);
        g.drawString(str, x, y);
        }
    }
}   
}
0

W kodzie nie ma niczego co by przesuwało przyciski do punktu (0,0). Przyciski się nie przesuwają.
W poprzednim kodzie miałeś klasę o nazwie Tutorial i klasa menu korzystała właśnie z klasy Tutorial. Teraz masz klasę tutorial, zmieniłeś również kod klasy menu?

0

Wszystko zmienione, żeby działało. W (0,0) pojawiają się obrazy przycisków po kliknięciu na okno z nazwą klawisza, który został wciśnięty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1