akcja po kliknięciu + metoda paintComponent()

Odpowiedz Nowy wątek
2011-04-23 23:40
0

Witajcie, jeśli chodzi o języka JAVA jestem początkujący, więc proszę wybaczcie, jeśli moje pytanie okaże się trywialne, jednak próbowałem sam sobie jakoś z tym poradzić, jednak bezskutecznie, więc do rzeczy.

Mój kod składa się z takich klas, głównej publicznej, JFrame'a, JPanel'a oraz mojej klasy: class akcjaPrzyciskStart implements ActionListener.

Problem tkwi w tym, że w klasie JPanel mam coś takiego:

class mojPanel extends JPanel
{   
    public void paintComponent(Graphics g)
    {       
        //tu sobie coś tam rysuje, jakieś okręgi itd        
    }
}

następnie chcę zrobić tak, żeby po wciśnieciu buttona, którego mam stworzonego w JFrame:

class mojaRamka extends JFrame
{
    public mojaRamka()
    { 
        JButton start = new JButton(" START ");
        panel1.add(start);
        akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(akcjaStart);    
    }
}

coś się rysowalo (np okrąg, obojętnie), dlatego też mam zdefiniowaną klasę:

class akcjaPrzyciskStart implements ActionListener
{
    public void actionPerformed(ActionEvent z)
    {

    }
}

jak to wpleść w tą klasę dla akcji?
z góry dzięki za pomoc


edytowany 1x, ostatnio: JrQ-, 2011-04-23 23:41

Pozostało 580 znaków

2011-04-24 01:31

Możesz zrobić tak:
Wywal tego implements ActionListener z klasy z akcja i zostaw po prostu public class akcjaPrzyciskStart{}, zamiast tego:
start.addActionListener(akcjaStart);
wstaw:


start.addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent event){
              //wywolanie obiektu twojej klasy z akcja
              akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
              }
});

I uczono mnie abym pisał nazwy klas od DużejLitery a zmienną od malejLitery. To chyba dobry nawyk ^^

Pozostało 580 znaków

2011-04-24 11:36
0

hmmm, niezbyt rozumiem, tzn kod jest oczywiście ok, zgadza się, ale co w związku z tym?
to wszystko mam w moim JFrame:

        JButton start = new JButton(" START ", new ImageIcon("start.png"));        
        panel1.add(start);
        start.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                  akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
            }
        });

a metodę, która rysuje mam w JPanelu:

    public void paintComponent(Graphics g) 
    {       
        Graphics2D g2 = (Graphics2D) g;

    }

jak z tego skorzystać?


Pozostało 580 znaków

2011-04-24 12:16
1

Albo ja nie rozumiem co chcesz osiągnąć albo Ty coś źle tłumaczysz, jeszcze raz.
Masz główną klasę z przyciskiem, tak?

  • Twój JFrame.
    Masz klasę która coś rysuje, tak?
  • JPanel.
    I z tej klasy chcesz wywolac metodę która ten rysunek wykona a następnie co?
    a) umieści go w głównym oknie?
    b) czy umieści w innym oknie które zostanie wygenerowane w klasie JPanel?

A może ja to źle rozumiem i tobie chodzi o coś innego?

Chodzi o ten fragment:

jak to wpleść w tą klasę dla akcji?

ale co ma byc wplecione do tej klasy? Wywołanie metody? Wywołanie obiektu klasy JPanel? Czy co?

edytowany 1x, ostatnio: tomas1704, 2011-04-24 12:18

Pozostało 580 znaków

2011-04-24 12:52
0

być może zamieszałem ;)
wobec tego jeszcze raz, w skrócie chce zrobić tak, aby po nacisnięciu buttona coś zostało narysowane, oto kod:

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

public class test3
{
    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame2 ramka = new JFrame2();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setSize(400, 400);
                ramka.setVisible(true);
            }
        });
    }   
}

class JFrame2 extends JFrame
{
    public JFrame2()
    {
        mojPanel panel1 = new mojPanel();
        add(panel1);

        JButton start = new JButton(" START ", new ImageIcon("start.png"));
        panel1.add(start);
        akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(akcjaStart);       
    }

}

class mojPanel extends JPanel
{   
    public void paintComponent(Graphics g)
    {       
        //tutaj rysuje coś od razu po uruchomieniu
            Graphics2D g2 = (Graphics2D) g;
        Rectangle2D kwadrat = new Rectangle2D.Double(100, 100, 55, 55);
        g2.draw(kwadrat);   
    }
}

class akcjaPrzyciskStart implements ActionListener
{
    public void actionPerformed(ActionEvent z)
    {
    //po nacisnieciu na przycisk cos jest rysowane
    }
}

Pozostało 580 znaków

2011-04-24 14:10
1

może to cie przybliży do celu :


public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame2 ramka = new JFrame2();
                ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ramka.setSize(400, 400);
                ramka.setVisible(true);
            }
        });
    }
}

class JFrame2 extends JFrame {
mojPanel panel1 = new mojPanel();
    public JFrame2() {

        add(panel1);

        JButton start = new JButton(" START ", new ImageIcon("start.png"));
        panel1.add(start);
        //   akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
        start.addActionListener(new akcjaPrzyciskStart());
    }
    class akcjaPrzyciskStart implements ActionListener {

    public void actionPerformed(ActionEvent z) {

        ((mojPanel) panel1).setI(180);

        panel1.revalidate();
        panel1.repaint();
    }
}
}

class mojPanel extends JPanel {

    int i = 100;

    void setI(int in) {
        i = in;
    }

    public void paintComponent(Graphics g) {
        //tutaj rysuje coś od razu po uruchomieniu
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D kwadrat = new Rectangle2D.Double(i, 100, 55, 55);
        g2.draw(kwadrat);
    }
}

ogólnie klasę z obsługą nasłuchu robi się jako klasę wewnętrzną(dzięki temu mamy bezpośredni dostęp do panelu)

edytowany 1x, ostatnio: remigio, 2011-04-24 14:11

Pozostało 580 znaków

2011-04-24 14:31
1

Kolega wyżej proponuje przy naciśnięciu modyfikacje obiektu mojPanel.
Moje rozwiązanie pokazuje jak można dodawać i usuwać zawartość kontenera aby uzyskać jakiś efekt oczywiście możesz to połączyć z metodą kolegi.
Przerobiłem twój kod ale jak znam życie doświadczony programista ci powie ze powinieneś to rozbić na całkiem oddzielne klasy/pliki a nie trzymać w jednym co zresztą jest dość logiczne. Ponad to nie jest to jakieś super eleganckie rozwiązanie ale może naprowadzi cię na to czego szukasz.
KOD:

package test;

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

public class OknoGlowne {

    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable(){
         public void run()
         {
            JFrame2 ramka = new JFrame2();
            ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ramka.setSize(400, 400);
            ramka.setVisible(true);
         }
    });
    }        
}

        class JFrame2 extends JFrame {
            private JButton start = new JButton(" START ", new ImageIcon("start.png"));
            private JButton stop = new JButton(" STOP ", new ImageIcon("start.png"));
            //robisz obiekt klasy mojPanel
            private mojPanel panel1 = new mojPanel();
            private JPanel panelMain = new JPanel();
            //robisz obiekt klasy akcjaPrzyciskStart
            private akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();

            public JFrame2()
            {      

                panelMain.add(start); 
                panelMain.add(stop); 
                panel1.setPreferredSize(new Dimension(300,300));
                akcjaStart.setPreferredSize(new Dimension(300,300));
                panelMain.add(panel1);

                add(panelMain);
                start.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent evet){

                       panelMain.remove(akcjaStart);
                       panelMain.add(panel1);
                        panelMain.revalidate();
                        panelMain.repaint();

                       //repaint();
                    }
                }); 
                stop.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent evet){
                        //robisz obiekt klasy akcjaPrzyciskStart

                        //zakladam ze narysowales sobie cos w mojpanel jako wejsciowa figure
                        //a teraz ktos kliknal przycisk i chcesz inna figure z klasy akcjaprzyciuskustart
                        //wiec moglo by to wygladac tak
                       panelMain.remove(panel1);
                       panelMain.add(akcjaStart);
                        panelMain.revalidate();
                        panelMain.repaint();
                    }
                }); 

            }

        }

        class mojPanel extends JPanel
        {        
            public void paintComponent(Graphics g)
            {                
                    //tutaj rysuje coś od razu po uruchomieniu
                    Graphics2D g2 = (Graphics2D) g;
                    Rectangle2D kwadrat = new Rectangle2D.Double(100, 100, 55, 55);
                    g2.draw(kwadrat);        
            }
        }

        class akcjaPrzyciskStart extends JPanel
        {
            public void paintComponent(Graphics g)
            {                
                    //tutaj rysuje coś od w twojej akcjiprzycisku
                    Graphics2D g2 = (Graphics2D) g;
                    Rectangle2D kwadrat = new Rectangle2D.Double(120, 120, 175, 175);
                    g2.draw(kwadrat);        
            }

        }

Pozdrawiam!

edytowany 1x, ostatnio: tomas1704, 2011-04-24 14:33

Pozostało 580 znaków

2011-04-24 16:11
0

Dziękuję Wam za pomoc, teraz już mniej więcej wiem jak to powinno wyglądać.
Żeby nie zakładać nowego tematu zapytam jeszcze w tym o jedną rzecz, mianowicie chciałbym utworzyć drugi przycisk, który tym razem wymazuje to co zostało narysowane, czy jest na to jakaś metoda, która potrafi to zrobić?


Pozostało 580 znaków

2011-04-24 16:48
1

No przecież podałem Ci rozwiązanie...
zamiast dodawać tych paneli "mojPanel" i "akcjaPrzyciskuStart" do mainPanel dodaj jeszcze jeden panel

Zamiast dodawać te rysunków (obiektów klasy mojPanel, akcjaPrzyciskStart) na przemian do mainPanel dodaj go do zawierajacyFigury a ten do głównego panelu
Zobacz:

class JFrame2 extends JFrame {
            private JButton reset = new JButton(" reset ", new ImageIcon("start.png"));
            private JButton start = new JButton(" START ", new ImageIcon("start.png"));
            private JButton stop = new JButton(" STOP ", new ImageIcon("start.png"));
            //robisz obiekt klasy mojPanel
            private mojPanel panel1 = new mojPanel();
            private JPanel panelMain = new JPanel();
            private JPanel zawierajacyFigury = new JPanel();
            //robisz obiekt klasy akcjaPrzyciskStart
            private akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();

            public JFrame2()
            {      

                panelMain.add(start); 
                panelMain.add(stop); 
                panelMain.add(reset);
                panel1.setPreferredSize(new Dimension(200,200));
                akcjaStart.setPreferredSize(new Dimension(200,200));
                zawierajacyFigury.setPreferredSize(new Dimension(300,300));
                zawierajacyFigury.add(panel1);
                panelMain.add(zawierajacyFigury);

                add(panelMain);
                start.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent evet){

                        zawierajacyFigury.remove(akcjaStart);
                        zawierajacyFigury.add(panel1);
                        zawierajacyFigury.revalidate();
                        zawierajacyFigury.repaint();

                    }
                }); 
                         //przycisk restartu wywala zawartosc zawierajacyFigury
                reset.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent evet){

                        zawierajacyFigury.removeAll();
                        zawierajacyFigury.revalidate();
                        zawierajacyFigury.repaint();
                    }
                }); 
                stop.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent evet){
                        //robisz obiekt klasy akcjaPrzyciskStart

                        //zakladam ze narysowales sobie cos w mojpanel jako wejsciowa figure
                        //a teraz ktos kliknal przycisk i chcesz inna figure z klasy akcjaprzyciuskustart
                        //wiec moglo by to wygladac tak
                        zawierajacyFigury.remove(panel1);
                        zawierajacyFigury.add(akcjaStart);
                        zawierajacyFigury.revalidate();
                        zawierajacyFigury.repaint();
                    }
                }); 

            }

        }

Pozostało 580 znaków

2011-04-25 00:20
0

dzięki za pomoc, cóż, pozostaje mi tylko coś pokombinować z tym


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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