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

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.

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.

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?

0

Nie

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);
                }
    }
}


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);
    }
  }
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));
    }
    
}

1

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.

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?

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.

0

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

Naprawdę dzięki, że pomagasz.

1

Tak, repaint wywołuje paintComponent
Jeśli chcesz zastępowac jedne figury drugimi, to

 public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(!rysowanie){
         return;
    }

Metoda paintComponenet z klasy bazowej (JPanel) zamalowuje wszystko kolorem tła - u Ciebie jest to kolor biały.

0

Teraz rysuje mi jednoczesnie kwadrat i prostokąt :/

  public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (!rysowanie) {
                return;
            }

            Graphics2D g2d = (Graphics2D) g;
            double bokA,bokB;
            bokA = Double.parseDouble(a.getText());
            bokB = Double.parseDouble(b.getText());
            int x = 30, y = 30;
            Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
            Rectangle2D pro = new Rectangle2D.Double(x,y,bokA,bokB);
            g2d.draw(kwa);
            g2d.draw(pro);
        }
    }
 public void actionPerformed(java.awt.event.ActionEvent e) {
        Object source = e.getSource();
        if (kwadrat.isSelected()) {
            BlokowanieKwadrat();
        }else if(kolo.isSelected()) {
            BlokowanieKolo();
        }else if(prostokat.isSelected()) {
            BlokowanieProstokat();
        }else if(trojkat.isSelected()) {
            BlokowanieTrojkat();
        }
        if (source == rysuj && kwadrat.isSelected()) {
            rysowanie = true;
            repaint();

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

0

Myśl, zamiast

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

napisz

if(kwadrat.isSelected()){
            Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
            g2d.draw(kwa);
{
else if(prostokat.isSelected()){
            Rectangle2D pro = new Rectangle2D.Double(x,y,bokA,bokB);
            g2d.draw(pro);
}
else if ...

W zależności od wybranego JRadioButton blokujesz pewne pola tekstowe, a odblokowujesz też?

0

No racja :D, Tak blokowałem jedne, odblokowałem drugie :)

0

Cześć znów wywala błąd jak próbuje rysować :/ Przed dodaniem kola działało:/

 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:57)
	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: 20 seconds)

 /*
 * 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.Ellipse2D;
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 boolean rysowanie = false;

    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) {
            super.paintComponent(g);
            if (!rysowanie) {
                return;
            }

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

            if (kwadrat.isSelected()) {
                Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
                g2d.draw(kwa);

            } else if (prostokat.isSelected()) {
                Rectangle2D pro = new Rectangle2D.Double(x, y, bokA, bokB);
                g2d.draw(pro);

            } else if (kolo.isSelected()) {
                Ellipse2D koleczko = new Ellipse2D.Double(x, y, r, r);
                g2d.draw(koleczko);
            }
        }
    }

    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);

        kwadrat.addActionListener(this);
        kolo.addActionListener(this);
        trojkat.addActionListener(this);
        prostokat.addActionListener(this);

        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 BlokowanieProstokat() {
        c.setEditable(false);
        prom.setEditable(false);
        a.setEditable(true);
        b.setEditable(true);

    }

    public void BlokowanieKwadrat() {
        b.setEditable(false);
        c.setEditable(false);
        prom.setEditable(false);
        a.setEditable(true);
    }

    public void BlokowanieTrojkat() {

        prom.setEditable(false);
        a.setEditable(true);
        b.setEditable(true);
        c.setEditable(true);
    }

    public void BlokowanieKolo() {
        b.setEditable(false);
        c.setEditable(false);
        a.setEditable(false);
        prom.setEditable(true);
    }

    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        Object source = e.getSource();
        if (kwadrat.isSelected()) {
            BlokowanieKwadrat();
        } else if (kolo.isSelected()) {
            BlokowanieKolo();
        } else if (prostokat.isSelected()) {
            BlokowanieProstokat();
        } else if (trojkat.isSelected()) {
            BlokowanieTrojkat();
        }

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

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

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

}

0

a nie masz pustego Stringa z którego chcesz zrobić liczbę double? java.lang.NumberFormatException: empty String

0

Nie raczej, bo blokuje niepotrzebne mi JTextField, pobieram najpierw później dopiero rysuje. Jak mówię coś spieprzyłem i nie wiem co, bo wcześniej (kwadrat i prostokąt ) rysowało.
@Edit. Już wiem, nieważne, że mam zaznaczone koło, czy co tam, blokuje JTextField to też bez znaczenia, bo mam do przekazania 3 Stringi z JTextField do zmiennych i gdy któreś jest puste to się sypie nawet, gdy nie jest potrzebne do rysowania konkretnej figury :/

Jakieś pomysły?

@Edit dodałem do klasy przechowującej konstruktor setText("0"); i Działa :)

0

Kiepskie rozwiązanie zastosowałeś, przecież użytkownik może to zero wymazać. Może tak:

 try{
            bokA = Double.parseDouble(a.getText());
            bokB = Double.parseDouble(b.getText());
            r = Double.parseDouble(prom.getText());
}
catch(NumberFormatException e){
}

Uchroni to program przed błędem również wtedy gdy użytkownik wpisze "d*pa" zamiast liczby, albo użyje przecinka jako separatora dziesiętnego.

0

Cześć kolejny problem, jak podejść do rysowania trójkąta, po tym jak użytkownik wprowadzi długości boków A, B i C do JTextField? Jakiej metody najlepiej użyć? I jak to powinno wyglądać mniej więcej :/ Chciałem to zrobić jakoś tak ale nie jest to ani wygodne, ani zbyt mądre i nie działa tak jak oczekiwałem (zaprzestałem na jednej lini)

  Graphics2D g2d = (Graphics2D) g;
            double bokA, bokB, r, x2, y2;
            bokA = Double.parseDouble(a.getText());
            bokB = Double.parseDouble(b.getText());
            r = Double.parseDouble(prom.getText());
            x2 = Double.parseDouble(a.getText());
            y2 = x2; 
            int x = 30, y = 30;
            double x1 = 40, y1 = 40;

            if (kwadrat.isSelected()) {
                Rectangle2D kwa = new Rectangle2D.Double(x, y, bokA, bokA);
                g2d.draw(kwa);

            } else if (prostokat.isSelected()) {
                Rectangle2D pro = new Rectangle2D.Double(x, y, bokA, bokB);
                g2d.draw(pro);

            } else if (kolo.isSelected()) {
                Ellipse2D koleczko = new Ellipse2D.Double(x, y, r, r);
                g2d.draw(koleczko);
                
            } else if (trojkat.isSelected()) {
                Line2D linia_A = new Line2D.Double(x1, y1, x2, y2);
                g2d.draw(linia_A);

@Edit O :) Dzięki, ale bez tego by nie działało. Dodam tam wyświetlanie jakiegoś komunikatu :) Jest w Javie coś takiego? takie okno z komunikatem?

0

Jeżeli chodzi o komunikat, to

JOptionPane.showMessageDialog(this,"Błądzisz synu","",JOptionPane.INFORMATION_MESSAGE);  

A jeśli chodzi o rysowanie, to czeka Cię lekcja geometrii, najpierw musisz sprawdzić, czy trójkąt o danych bokach istnieje, muszą być spełnione warunki: a+b > c, a+c > b i b+c > a.
Potem wybierasz położenie jednego wierzchołka (A) rysujesz odcinek poziomy o długości c do wierzchołka (B) i korzystając ze znajomości geometrii wyznaczasz punkt przecięcia okręgu o środku (A) i promieniu b z okręgiem o środku (B) i promieniu a. Punkt przecięcia będzie trzecim wierzchołkiem.

0

No trochę błądzę :D Czyli w tym wypadku Line2D to jedyna opcja?

0

Nie jedyna i nie najlepsza. Użyj metody drawPolyline, przekaż do niej cztery punkty, przy oznaczeniach z poprzedniego postu: (A), (B), (C), (A).

0

drawPolyline(int[] xPoints , int[] yPoints, int nPoints) Czyli, będą mi potrzebne dwie tablice? I to w nich mam umieścić współrzędne jakie mi wyjdą. Dobrze kombinuje, że pierwsza x i pierwsza y może być na sztywno bo będzie to wierzchołek A, a reszta na zmiennych?

0

Prawie dobrze kombinujesz, pierwsza i ostatnia (tzn. czwarta) współrzędne będą wpisane na sztywno i będą sobie równe.

0

drawPolyline jest na tablicach int nie chce mi przyjąć tych double, można jakoś przekazać tablice double do drawPolyline?

0

Przecież współrzędne ekranowe są całkowite (w pikselach), musisz wyniki obliczeń rzutować na inta.

0

Dobra zrobione :) Teraz mam pytanko takie, chce rozbić tak, że po naciśnięciu ppm na tym panelu co rysuje, wyszło menu kontekstowe z dwoma opcjami, jedna to zmiana koloru a druga zmiana rysunku na 3D :P Jest możliwość zmiany koloru już narysowanego obiektu i jak to wszystko powinno mniej więcej wyglądać :)?

0

Dopisz w klasie pole, np

private Color color = Color.BLACK;

W metodzie paintComponent dopisz

Graphics2D g2d = (Graphics2D) g;
g2d.setColor(color);

W obsłudze menu kontekstowego wyświetlanego po ppm i po wyborze koloru napisz

color = wybrany kolor
repaint();
0

Menu kontekstowe i jego items powinienem tworzyć w klasie Okno, czy w klasie DrawPanel? Czy może w całkiem osobnej klasie?

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