[JAVA] Przycisk prostokąt

0

Witam,
Mam pytanie, jak zrobić przycisk aby rysował prostokąt np: aby odwoływał się do tego fragmentu kodu:

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;  
        
        // draw a rectangle
        double leftX = 120;
        double topY = 100;
        double width = 350;
        double height = 150;
        
        Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
		g2.setPaint(Color.black);
		g2.fill(rect);
        g2.draw(rect);
     }

 
0

Twoja metoda potrzebuje obiektu Graphics, po którym odbywa się rysowanie, więc musisz go jakoś dostarczyć. Albo rysować na bitmapie, albo np bezpośrednio na jakimś komponencie. Rysowanie na panelu(panelChart) wygladałoby np tak:

private void buttonDraw_Click(object sender, EventArgs e)
{
 this.paintComponent(this.panelChart.CreateGraphics());
}
 
0

Jeszcze mam inne pytanie, a czy pod zmienne które są przy Double da się podczepić pola tekstowe by z okna aplikacji podawać nie tylko rozmiar prostokąta ale i położenie?
Sam przycisk nic nie da skoro dane są podane ale i tak dzięki:)

0

tak
możesz użyć TextBox, albo lepiej NumericUpDown i w odpowiednim momencie (przed rysowaniem) z odpowiednich kontrolek pobrać wartości i rzypisać sobie do zmiennych

0

Proszę o poprawienie ale gdy mam np:

class Panel extends Jpanel {
                       
                      panel() 

                    {

           Czy tu moge dać np:
                   double  a;
                    double b
                    }
}

        

czy inaczej mam TextBox przypisać?

0

To ty piszesz w c# czy w javie? I napisz co chcesz konkretnie zrobić

0

Nie, nie piszę w C#, w ogóle tego języka nie znam, a z javą kiedyś miałem styczność lecz nie znam javy i w niektórych momentach mylę się. Chodzi mi o to że chcę aby do czterech pól jTextField była przypisana wartość typu danych:

   
np:
public class Prostokat extendx JFrame
 {
  class prostokat
    {
            double x;
            double y;
            double szer; // od szerokości prostokąta
            double wys; // od wysokości prostokąta


           add(new JLabel("Podaj położenie prostokąta na osi X"));
           add(new JTextField("   "));

           add(new JLabel("Podaj położenie prostokąta na osi Y "));
           add(new JTextField(" "));

           add(new JLabel("Podaj szerokość prostokąta :"));
           add(new JTextField("  "));

           add(new JLabel("Podaj wysokość prostokąta :"));
           add(new JTextButton(" "));
        }
  }

I w tej klasie prostokąt dać obliczanie pola, oraz wywołanie za pomocą przycisku powyższego kodu z Graphic g który by byl w tej lub osobnej klasie. Wiem , że zaraz padną teksty typu: człowieku co ty piszesz! To nie obiektowość ale chce i na tej zasadzie napisać trzeci program.

0

Więc udostępnij te zmienne przez właściwości, które będziesz ustawiał z zewnątrz klasy, i zrób metodę licz pole, która policzy ci pole prostokąta. O to chodziło?

0

W tym zadaniu co mam i piszę o tym, mam nie obliczać pola a wyznaczać pole dowolnego prostokąta w technologii obiektowej.
I chcę dołączyć wyrysowanie pola dowolnego prostokąta a w trzecim zadaniu za pomocą klasy kalkulator wyznaczać pole dowolnego prostokąta a obliczenia wykonywać za pomocą klasy kalkulator.

0

Ok to daje jeszcze raz treść zadania:
Napisać program wyznaczający pole dowolnego prostokąta (technologia obiektowa)
i trzecie zadanie mam napisać tyle że obliczenia za pomocą klasy kalkulator. Trzecie mam zrobione bo jest kalkulator w klasie kalkulator ale wyznaczania nie ma a sa dwa pola do podawania danych.

0

Imo, kod który dostałeś http://4programmers.net/Forum/Newbie/173365-wyznaczanie_dowolnego_pola_prostokata_w_java?start=10 jest kompletnym rozwiązaniem zadania 1.

0

Jeżeli tak uważacie to z wami się kłócić nie będe. ma być obiektowo i wyznaczać dowolne pole tylko dla mnie to jest ok, facet się przyczepi i powie co innego np: że Gui nie ma a jest dziwny.
To teraz muszę zrobić kalkulator co będzie w klasie kalkulator i robić obliczenia wyznaczając dowolne pole prostokąta.

0

Więc dorób do tego GUI. Daj dwa okienka gdzie wpiszesz długość i szerokość prostokąta, a w jakimś labelu np wypiszesz rozwiązanie po kliknięciu buttona. Czy w tym masz problem w napisaniu GUI, czy połączeniu tego w całość?

0

Powiem tak,mam napisany w NB program realizujący wzór z tego kodu co bo uważa że program spełnia zadanie. tylko inaczej to zrobilem i nie jest w klasach a jest w jednej klasie co jest panel, odwołania do JtextField i nasłuchiwanie przycisków. Pokaże :

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


public class poleprostokata
{
  public static void main(String args[])
    {
      poleprost poleprost =new  poleprost();
      poleprost.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      poleprost.setVisible(true);
      poleprost.setResizable(false);
      
      
  }
}
class poleprost extends JFrame
{
  public poleprost()
  {
    setTitle(" Pole Prostokąta");
    setSize(210,290);
    polenew prost =new polenew();
    Container licz=getContentPane();
    licz.add(prost);


  }
}
class polenew extends JPanel // tworzymy nowy obiekt MójPanel
{

  JTextField dłA;
  JTextField dłB;
  JTextField wynikpole;
 
 

  public polenew()
  {
    setLayout(new FlowLayout(FlowLayout.LEFT));
  
    
    JLabel info1=new JLabel("Podaj długość pierwszego boku");
    add(info1);

    dłA=new JTextField("",15);
    add(dłA);

    JLabel info2=new JLabel("Podaj długość drugiego boku");
    add(info2);

    dłB=new JTextField("",15);
    add(dłB);

    JButton mnozenie=new JButton("Oblicz");
    add(mnozenie);

    JButton czysc=new JButton("Wyczyść pola");
    add(czysc);

    JLabel lab3=new JLabel("Pole prostokąta wynosi:");
    add(lab3);

    
    
    ActionListener sl3=new Oblicz();
    mnozenie.addActionListener(sl3);

    ActionListener cls = new Clear();
    czysc.addActionListener(cls);

    wynikpole=new JTextField("",15);
    add(wynikpole);
    

    }
  class Oblicz implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    {
        
       double bokA=Double.parseDouble(dłA.getText());
       double bokB=Double.parseDouble(dłB.getText());
       double iloczyn=bokA*bokB;
      wynikpole.setText(""+iloczyn);

    }
  }

  class Clear implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    {
        wynikpole.setText("");
        dłA.setText("");
        dłB.setText("");   
    }
  }

  
}




 

Tylko że wg.niektórych osób to nie jest obiektowo i teraz nie wiem jak inaczej to napisać.

0

Imo za dużo namieszałeś. Musisz posłużyć się klasą prostokąt, którą masz już gotową. Jeżeli chcesz mieć do tego GUI to dodaj na główną formę to wszystko co chciałeś umieścić na panelu "polenew": labele, dwa buttony i pola do wpisywania długości boków(najlepiej żeby to były pola do wpisywania jedynie wartości numerycznych). I wtedy w click buttona "Oblicz" wpisujesz:

float bokA=Double.parseFloat(dłA.getText());//pobierasz dwie zmienne z pol tekstowych, lepiej byloby zebys uzyl kontrolek do wprowadzania 
float bokB=Double.parseFloat(dłB.getText());//wartosci liczbowych  - uniknalbys mozliwosci popelnienia bledu i wpisania np zwyklego tekstu
Prostokat p = new Prostokat(bokA, bokB);        //tworzysz obiekt klasy prostokat ktora sam zdefiniowales
wynikpole.setText(p.obliczPole());                  //wpisujesz wartość pola do labela(tu musisz jakos zamienic wartosc float na string)
0

to z polenew() mam wyrzucić wszystko i wstawić ten kod co podałeś? oraz dać tamten kod w polenew? Coś takiego:

 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
 
public class poleprostokata
{
  public static void main(String args[])
    {
      poleprost poleprost =new  poleprost();
      poleprost.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      poleprost.setVisible(true);
      poleprost.setResizable(false);
     Prostokat p = new Prostokat(bokA, bokB);        
     
 
 
  }
}
class poleprost extends JFrame
{
  public poleprost()
  {
    setTitle(" Pole Prostokąta");
    setSize(210,290);
    polenew prost =new polenew();
    Container licz=getContentPane();
    licz.add(prost);
 
 
  }
}

class Prostokat {
 
    private float a, b;
    public float obliczPole() {
        return a * b;
    }
 
    /**
     * Konstruktor
     */
    Prostokat(float a, float b) {
        this.a = a;
        this.b = b;
    }
}
 


class polenew extends JPanel // tworzymy nowy obiekt MójPanel
{
 
  public polenew()
  {


    setLayout(new FlowLayout(FlowLayout.LEFT));
 
 
    JLabel info1=new JLabel("Podaj długość pierwszego boku");
    add(info1);
 
    dłA=new JTextField("",15);
    add(dłA);
 
    JLabel info2=new JLabel("Podaj długość drugiego boku");
    add(info2);
 
    dłB=new JTextField("",15);
    add(dłB);
 
    JButton mnozenie=new JButton("Oblicz");
    add(mnozenie);
 
    JButton czysc=new JButton("Wyczyść pola");
    add(czysc);
 
    JLabel lab3=new JLabel("Pole prostokąta wynosi:");
    add(lab3);
 
 
 
    ActionListener sl3=new Oblicz();
    mnozenie.addActionListener(sl3);
 
    ActionListener cls = new Clear();
    czysc.addActionListener(cls);
 
    wynikpole=new JTextField("",15);
    add(wynikpole);
 
 
    }
  class Oblicz implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    {
 
       float bokA=Double.parseFloat(dłA.getText());
       float bokB=Double.parseFloat(dłB.getText());
       wynikpole.setText(p.obliczPole());                  
    }
  }
 
  class Clear implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    {
        wynikpole.setText("");
        dłA.setText("");
        dłB.setText("");   
    }
  }
 
 
}


Hmm troche się pogubiłem:(

0

Nie znam javy i pewnie niechcący rochę tobie namieszałem, ale chyba twój kod powinien wyglądać jak przemieszanie tych dwóch, które wrzuciłeś wcześniej, coś takiego:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
  
public class poleprostokata
{
  public static void main(String args[])
    {
      poleprost poleprost =new  poleprost();
      poleprost.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      poleprost.setVisible(true);
      poleprost.setResizable(false);
  }
}

class Prostokat {
 
    private float a, b;
    public float obliczPole() {
        return a * b;
    }
 
    /**
     * Konstruktor
     */
    Prostokat(float a, float b) {
        this.a = a;
        this.b = b;
    }
}

class poleprost extends JFrame
{
  public poleprost()
  {
    setTitle(" Pole Prostokąta");
    setSize(210,290);
    polenew prost =new polenew();
    Container licz=getContentPane();
    licz.add(prost);
  }
}
class polenew extends JPanel // tworzymy nowy obiekt MójPanel
{ 
  JTextField dłA;
  JTextField dłB;
  JTextField wynikpole;
 
  public polenew()
  {
    setLayout(new FlowLayout(FlowLayout.LEFT)); 
 
    JLabel info1=new JLabel("Podaj długość pierwszego boku");
    add(info1);
 
    dłA=new JTextField("",15);
    add(dłA);
 
    JLabel info2=new JLabel("Podaj długość drugiego boku");
    add(info2);
 
    dłB=new JTextField("",15);
    add(dłB);
 
    JButton mnozenie=new JButton("Oblicz");
    add(mnozenie);
 
    JButton czysc=new JButton("Wyczyść pola");
    add(czysc);
 
    JLabel lab3=new JLabel("Pole prostokąta wynosi:");
    add(lab3);
 
    ActionListener sl3=new Oblicz();
    mnozenie.addActionListener(sl3);
 
    ActionListener cls = new Clear();
    czysc.addActionListener(cls);
 
    wynikpole=new JTextField("",15);
    add(wynikpole);
  }
  class Oblicz implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    { 
       float bokA=Double.parseFloat(dłA.getText());
       float bokB=Double.parseFloat(dłB.getText());
       /*pobierasz dwie zmienne z pol tekstowych, lepiej byloby zebys uzyl kontrolek do wprowadzania wartosci liczbowych  - uniknalbys  mozliwosci popelnienia bledu i wpisania np zwyklego tekstu*/
       Prostokat p = new Prostokat(bokA, bokB);  //tworzysz obiekt klasy prostokat ktora sam zdefiniowales
       wynikpole.setText(p.obliczPole()); //wpisujesz wartość pola do labela(tu musisz jakos zamienic wartosc float na string)
    }
  }
 
  class Clear implements ActionListener
  {
    public void actionPerformed(ActionEvent zdarzenie)
    {
        wynikpole.setText("");
        dłA.setText("");
        dłB.setText("");   
    }
  } 
}
 

Twojemu nauczycielowi pewnie chodzi o to, że przy obliczaniu pola prostokąta masz korzystać z obiektu Prostokąt, a nie wyliczać tak jak to zrobiłeś dwa posty wyżej:

double bokA=Double.parseDouble(dłA.getText());
double bokB=Double.parseDouble(dłB.getText());
double iloczyn=bokA*bokB;
 

Wyliczenie pola prostokąta jest akurat proste, ale chodzi o to żebyś zrozumiał, że jak się trafi coś bardziej skomplikowanego, np jakieś obliczenia które zajmują kilkadziesiąt/kilkaset linii kodu, to lepiej zamknąć je w jakiejś osobnej klasie, a potem posługiwać się tylko jej obiektem, ustawiając parametry do obliczeń i całą resztę innych rzeczy, które się zmieniają, a resztę zamknąć w klasie, np wszelkie stałe, czy metody pomocnicze.

0

nauczycielowi chodzi aby to była technologia obiektowa wyznaczająca pole dowolnego prostokąta. jak ten kod z polami tekstowymi,buttonami sie nie spodoba pokaże sam kod co wyżej był przedstawiony przez bo.Nie wiem czy program działa ale sprawdzę w wolnej chwili. dzięki:)

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