Przekazanie wartości pola JTextField do Metody rysującej kwadrat

2016-12-29 00:07
0

Cześć mam problem. Mam Klase Tekst, która wygląda tak:

 public class Tekst extends JTextField {

    public Tekst(String name,int pozX, int pozY, int dlugosc, int wysokosc){
        setText(name);
        setBounds(pozX,pozY,dlugosc,wysokosc);

    }

}

Wywołuje to w klasie Okno :

public class Okno extends JFrame {

    public Okno(){
        super("Pola powierzchni");
        setSize(600,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        Panel panel = new Panel();
        add(panel);

        Przyciski oblicz = new Przyciski("Oblicz",350,30,100,20);
        Przyciski rysuj = new Przyciski("Rysuj",350,60,100,20);
        add(rysuj);
        add(oblicz);

        Tekst a = new Tekst("A",480,30,70,25);
        Tekst b = new Tekst("B",480,60,70,25);
        Tekst c = new Tekst("C",480,90,70,25);
        Tekst prom = new Tekst("Promień",480,120,70,25);
        add(b);
        add(a);
        add(c);
        add(prom);
         double bokA = Double.parseDouble(a.getText());

        Separator rysunek = new Separator("Rysunek",15,15,330,330);
        Separator dane = new Separator("Dane wejściowe",340,15,220,330);
        Separator wyniki = new Separator("Wyniki obliczeń",15,341,545,190);
        add(wyniki);
        add(dane);
        add(rysunek);

        RadioButton kwadrat = new RadioButton("Kwadrat", 350,100,100,20);
        RadioButton kolo = new RadioButton("Koło", 350,140,100,20);
        RadioButton trojkat = new RadioButton("Trójkąt", 350,180,100,20);
        RadioButton prostokat = new RadioButton("Prostokąt", 350,220,100,20);

        ButtonGroup grupa = new ButtonGroup();
        grupa.add(trojkat);
        grupa.add(prostokat);
        grupa.add(kolo);
        grupa.add(kwadrat);

        add(trojkat);
        add(prostokat);
        add(kolo);
        add(kwadrat);

        Labels pole = new Labels("Pole powierzchni = ",35,360,150,20);
        Labels obwod = new Labels("Obwód = ",35,400,150,20);
        Labels przekatna = new Labels("Przekątna = ",35,440,150,20);
        Labels wysokosc = new Labels("Wysokość = ",35,480,150,20);
        add(obwod);
        add(pole);
        add(przekatna);
        add(wysokosc);
        setVisible(true);
    }

    protected void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        double bokA = Double.parseDouble(a.getText());
        int x = 30,y = 30;

        Rectangle2D kwadrat = new Rectangle2D.Double(x, y, bokA, bokA);
    }
}

Użytkownik będzie wpisywał wymiary np. kwadratu (pola będą aktywne w zależności od wybraniej figury) Chcę żeby ten wymiar, był przekazany do metody rysującej kwadrat. I tu jest problem.Mam coś takiego w klasie Okno:

protected void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        double bokA = Double.parseDouble(a.getText());
        int x = 30,y = 30;

        Rectangle2D kwadrat = new Rectangle2D.Double(x, y, bokA, bokA);
    } 

pokazuje mi błąd przy próbie przekazania zawartości pola JTextFiled a do zmiennej bokA.
Co spieprzyłem? :D

@edit To samo w konstruktorze? Okno działa.

edytowany 5x, ostatnio: tomaszek993, 2016-12-29 00:14

Pozostało 580 znaków

2016-12-29 09:10
1

W Twoim kodzie nie ma żadnych pól typu JTextField. a, b, c i bokA zdefiniowane w konstruktorze klasy Okno, są zmiennymi lokalnymi konstruktora. Nie są widoczne w żadnej innej metodzie, w w szczególności nie są widoczne w metodzie paintComponent.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-29 21:55
0

Ok. przekazane, działa. Mam jeszcze pytanie czy metoda 'paintComponent', może być w innej klasie i być wywoływana np. po przyciśnięciu buttona?

Pozostało 580 znaków

2016-12-29 22:20
0

Nie


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-29 22:33
0

To w jaki sposób mam zrobić, żeby po naciśnięciu Rysuj, narysował mi kwadrat w JPanel panel? O parametrach przekazanych z JTextField?

/*
 * 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 aplikacja;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javafx.event.ActionEvent;
import javax.swing.*;

/**
 *
 * @author Tomek
 */
public class Okno extends JFrame implements ActionListener {

    public Tekst a;
    public Tekst b;
    public Tekst c;
    public Tekst prom;

    public Przyciski oblicz, rysuj;
    public Panel panel;
    public Labels pole, obwod, przekatna, wysokosc;
    public Separator rysunek, dane, wyniki;
    public RadioButton kwadrat, kolo, trojkat, prostokat;

    public Okno() {
        super("Pola powierzchni");
        setSize(600, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        panel = new Panel();
        add(panel);

        oblicz = new Przyciski("Oblicz", 350, 30, 100, 20);
        oblicz.addActionListener(this);
        rysuj = new Przyciski("Rysuj", 350, 60, 100, 20);
        rysuj.addActionListener(this);
        add(rysuj);
        add(oblicz);

        a = new Tekst("A", 480, 30, 70, 25);
        b = new Tekst("B", 480, 60, 70, 25);
        c = new Tekst("C", 480, 90, 70, 25);
        prom = new Tekst("Promień", 480, 120, 70, 25);
        add(b);
        add(a);
        add(c);
        add(prom);

        rysunek = new Separator("Rysunek", 15, 15, 330, 330);
        dane = new Separator("Dane wejściowe", 340, 15, 220, 330);
        wyniki = new Separator("Wyniki obliczeń", 15, 341, 545, 190);
        add(wyniki);
        add(dane);
        add(rysunek);

        kwadrat = new RadioButton("Kwadrat", 350, 100, 100, 20);
        kolo = new RadioButton("Koło", 350, 140, 100, 20);
        trojkat = new RadioButton("Trójkąt", 350, 180, 100, 20);
        prostokat = new RadioButton("Prostokąt", 350, 220, 100, 20);

        ButtonGroup grupa = new ButtonGroup();
        grupa.add(trojkat);
        grupa.add(prostokat);

        grupa.add(kolo);
        grupa.add(kwadrat);

        add(trojkat);
        add(prostokat);
        add(kolo);
        add(kwadrat);

        pole = new Labels("Pole powierzchni = ", 35, 360, 150, 20);
        obwod = new Labels("Obwód = ", 35, 400, 150, 20);
        przekatna = new Labels("Przekątna = ", 35, 440, 150, 20);
        wysokosc = new Labels("Wysokość = ", 35, 480, 150, 20);
        add(obwod);
        add(pole);
        add(przekatna);
        add(wysokosc);

        setVisible(true);
    }

    protected void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        double bokA;
        bokA = Double.parseDouble(a.getText());
        int x = 30, y = 30;

        Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
        g2d.draw(kwa);
    }

    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
       Object source = e.getSource();

                if(source == rysuj && kwadrat.isSelected() ){

                    // Test działania i przekazania 
                    String bokAA = a.getText();
                    pole.setText(bokAA);
                }
    }
}
edytowany 2x, ostatnio: tomaszek993, 2016-12-29 22:55

Pozostało 580 znaków

2016-12-29 23:09
1

Napisz metodę paintComponent w klasie dziedziczącej po JPanel. (Masz błędną sygnaturę tej metody, powinna być public void.)

public class Okno extends JFrame implements ActionListener { 
   ...
  private DrawPanel panel;
  ...
  class DrawPanel extends JPanel(){
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        double bokA;
        bokA = Double.parseDouble(a.getText());
        int x = 30, y = 30;
        Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
        g2d.draw(kwa);
    }
  }

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-29 23:23
0

Utworzyć nową klasę czy dopisać do mojej z konstruktorem? Bo nie ogarnąłem :/ Moja klasa Panel:

 public class Panel extends JPanel {

    public Panel(){
        setBounds(30,30,300,300);
        setBackground(Color.WHITE);
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

}

Pozostało 580 znaków

2016-12-29 23:31

Całą definicję klasy DrawPanel umieść wewnątrz klasy Okno. Nie nazywaj swojej klasy Panel, w standardowej bibliotece graficznej Javy jest klasa o nazwie Panel - utrudniasz innym rozumienie Twojego kodu.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-30 18:51
0

Dobra teraz rysuje, ale pojawił się inny problem kiedy jest bokA = Double.parseDouble(a.getText());
wywala taki błąd :

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at aplikacja.Okno$DrawPanel.paintComponent(Okno.java:48)
    at javax.swing.JComponent.paint(JComponent.java:1056)
    at javax.swing.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paint(JComponent.java:1065)
    at javax.swing.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paint(JComponent.java:1065)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
    at javax.swing.JComponent.paintChildren(JComponent.java:889)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
    at javax.swing.JComponent.paint(JComponent.java:1042)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
    at java.awt.Container.paint(Container.java:1975)
    at java.awt.Window.paint(Window.java:3904)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
BUILD SUCCESSFUL (total time: 2 seconds)

Kod:

 /*
 * 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 aplikacja;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javafx.event.ActionEvent;
import javax.swing.*;

/**
 *
 * @author Tomek
 */
public class Okno extends JFrame implements ActionListener {

    public Tekst a;
    public Tekst b;
    public Tekst c;
    public Tekst prom;

    public Przyciski oblicz, rysuj;

    public Labels pole, obwod, przekatna, wysokosc, wartosc_A, wartosc_B,wartosc_C, promien;
    public Separator rysunek, dane, wyniki;
    public RadioButton kwadrat, kolo, trojkat, prostokat;

    public DrawPanel panel;

     public class DrawPanel extends JPanel {

        public DrawPanel(int x, int y, int dlugosc , int wysokosc){
        setBounds(x,y,dlugosc,wysokosc);
        setBackground(Color.WHITE);
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

        @Override
        public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        double bokA;
        bokA = Double.parseDouble(a.getText());
        int x = 30, y = 30;
        Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
        g2d.draw(kwa);
    }
    }

    public Okno() {
        super("Pola powierzchni");
        setSize(600, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);

        panel = new DrawPanel(30,30,300,300);
       add(panel);

        oblicz = new Przyciski("Oblicz", 450, 280, 100, 20);
        oblicz.addActionListener(this);
        rysuj = new Przyciski("Rysuj", 450, 310, 100, 20);
        rysuj.addActionListener(this);
        add(rysuj);
        add(oblicz);

        a = new Tekst( 480, 30, 70, 25);
        b = new Tekst( 480, 60, 70, 25);
        c = new Tekst( 480, 90, 70, 25);
        prom = new Tekst( 480, 120, 70, 25);
        add(b);
        add(a);
        add(c);
        add(prom);

        rysunek = new Separator("Rysunek", 15, 15, 330, 330);
        dane = new Separator("Dane wejściowe", 340, 15, 220, 330);
        wyniki = new Separator("Wyniki obliczeń", 15, 341, 545, 190);
        add(wyniki);
        add(dane);
        add(rysunek);

        kwadrat = new RadioButton("Kwadrat", 350, 180, 100, 20);
        kolo = new RadioButton("Koło", 350, 220, 100, 20);
        trojkat = new RadioButton("Trójkąt", 350, 260, 100, 20);
        prostokat = new RadioButton("Prostokąt", 350, 300, 100, 20);

        ButtonGroup grupa = new ButtonGroup();
        grupa.add(trojkat);
        grupa.add(prostokat);

        grupa.add(kolo);
        grupa.add(kwadrat);

        add(trojkat);
        add(prostokat);
        add(kolo);
        add(kwadrat);

        pole = new Labels("Pole powierzchni = ", 35, 360, 150, 20);
        obwod = new Labels("Obwód = ", 35, 400, 150, 20);
        przekatna = new Labels("Przekątna = ", 35, 440, 150, 20);
        wysokosc = new Labels("Wysokość = ", 35, 480, 150, 20);
        wartosc_A = new Labels("Bok A =",390,30,100,20);
        wartosc_B = new Labels("Bok B =",390,60,100,20);
        wartosc_C = new Labels("Bok C =",390,90,100,20);
        promien = new Labels("Promień =",390,120,100,20);
        add(obwod);
        add(pole);
        add(przekatna);
        add(wysokosc);
        add(wartosc_A);
        add(wartosc_B);
        add(wartosc_C);
        add(promien);

        setVisible(true);
    }

    public void Blokowanie() {
        if (kwadrat.isSelected()){
            b.setEditable(false);
            c.setEditable(false);
            prom.setEditable(false);
        }
    }

    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
               Object source = e.getSource();

                if(source == rysuj && kwadrat.isSelected() ){

                }
    }

}

Mam jeszcze pytanie, gdzie powinienem umieścić/ wywołać metodę Blokowanie, tak aby zadziałało tak, że jak zaznaczę RadioButton Kwadrat to wybrane JTextField będą niedostępne?

edytowany 1x, ostatnio: tomaszek993, 2016-12-30 18:53

Pozostało 580 znaków

2016-12-30 20:17
0

Próbujesz rysować za wcześnie, użytkownik jeszcze niczego nie wybrał, ani niczego nie zdążył wpisać. Dodaj do klasy okno pole

 private boolean rysowanie = false;

zmień trochę metodę paintComponent

public void paintComponent(Graphics g){
    if(!rysowanie){
         return;
    }
    Graphics2D g2d = (Graphics2D) g;

zmień metodę actionPerformed

                if(source == rysuj && kwadrat.isSelected() ){
                     rysowanie = true;
                     repaint();
                } 

Dodaj do tego RadioButton jakiegoś listenera, metodę Blokowanie wywołaj w obsłudze zdarzenia.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-30 20:46
0

repaint(); wywołuje paintComponent? A kiedy będę chciał rysować koło, a w paintComponentmam już kwadrat?

Naprawdę dzięki, że pomagasz.

edytowany 4x, ostatnio: tomaszek993, 2016-12-30 21:59

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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