hellpaint [co ulepszyć w programie]

0

witam

import javax.swing.*;

public class Paint
{
public static void main(String args[])
{
ProsteOkno okno = new ProsteOkno();
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setVisible(true);
}
}

import javax.swing.;
import java.awt.
;
import java.awt.geom.;
import java.awt.event.
;
import java.lang.String;
import java.awt.Container;
class Panel extends JPanel
{

public Panel()
{
 setBackground(Color.LIGHT_GRAY);
 repaint();
// menu programu
 
 JMenuBar pasekMenu = new JMenuBar();
 JMenu menuPlik = new JMenu("Plik");
 JMenuItem elemNowy = new JMenuItem("Nowy");
 menuPlik.add(elemNowy);
 JMenuItem elemOtworz = new JMenuItem("Otwórz");
 menuPlik.add(elemOtworz);
 JMenuItem elemZapisz = new JMenuItem("Zapisz");
 menuPlik.add(elemZapisz);
 menuPlik.addSeparator();
 menuPlik.add(new AbstractAction("Zamknij")
 {
     public void actionPerformed(ActionEvent zdarzenie)
     {
         System.exit(0);
     }
 });
 pasekMenu.add(menuPlik);
 JMenu menuEdycja = new JMenu("Edycja");
 JMenu elemCofnij = new JMenu("Cofnij");
 ButtonGroup Cgrupa = new ButtonGroup();
 JMenuItem Clinia = new JMenuItem ("linia");
 Cgrupa.add(Clinia);
 elemCofnij.add(Clinia);
 elemCofnij.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {

 }
 });
 JMenuItem Ctrojkat = new JMenuItem ("trójkąt");
 Cgrupa.add(Ctrojkat);
 elemCofnij.add(Ctrojkat);
 elemCofnij.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {

 }
 });
 JMenuItem Ckwadrat = new JMenuItem ("kwadrat");
 Cgrupa.add(Ckwadrat);
 elemCofnij.add(Ckwadrat);
 elemCofnij.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {

 }
 });
 JMenuItem Cokrag = new JMenuItem ("okrąg");
 Cgrupa.add(Cokrag);
 elemCofnij.add(Cokrag);
 elemCofnij.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {

 }
 });
 JMenuItem Celipsa = new JMenuItem ("elipsa");
 Cgrupa.add(Celipsa);
 elemCofnij.add(Celipsa);
 elemCofnij.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {

 }
 });
 
 menuEdycja.add(elemCofnij);
 JMenuItem elemWyczysc = new JMenuItem("Wyczyść obraz");
 menuEdycja.add(elemWyczysc);
 JMenu elemTlo = new JMenu("Zmień kolor tła");
 ButtonGroup Bgrupa = new ButtonGroup();
 JRadioButton Bczarny = new JRadioButton("czarny",false);
 Bgrupa.add(Bczarny);
 elemTlo.add(Bczarny);
 Bczarny.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.black);
 repaint();
 }
 });

 JRadioButton Bzielony = new JRadioButton("zielony",false);
 Bgrupa.add(Bzielony);
 elemTlo.add(Bzielony);
 Bzielony.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.green);
 repaint();
 }
 });
 
 JRadioButton Bniebieski = new JRadioButton("niebieski",false);
 Bgrupa.add(Bniebieski);
 elemTlo.add(Bniebieski);
 Bniebieski.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.blue);
 repaint();
 }
 });
 
 JRadioButton Bbialy = new JRadioButton("biały",false);
 Bgrupa.add(Bbialy);
 elemTlo.add(Bbialy);
 Bbialy.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.white);
 repaint();
 }
 });
 
 JRadioButton Bczerwony = new JRadioButton("czerwony",false);
 Bgrupa.add(Bczerwony);
 elemTlo.add(Bczerwony);
 Bczerwony.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.red);
 repaint();
 }
 });
 
 JRadioButton Bzolty = new JRadioButton("żółty",false);
 Bgrupa.add(Bzolty);
 elemTlo.add(Bzolty); 
 Bzolty.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
 setBackground(Color.YELLOW);
 repaint();
 }
 });
  
 menuEdycja.add(elemTlo);
 menuEdycja.addSeparator();
 JMenuItem elemSiatka = new JCheckBoxMenuItem("siatka",false);
 elemSiatka.addActionListener(new ActionListener()
 {
 public void actionPerformed(ActionEvent zdarzenie)
 {
  if (siatka == true) siatka = false;
  if (siatka == false) siatka = true;
 repaint();
 }
 });
 menuEdycja.add(elemSiatka);
 pasekMenu.add(menuEdycja);
 JMenu menuInfo = new JMenu("Info");
 pasekMenu.add(menuInfo);
 this.add(pasekMenu);
 // koniec menu 


// przyciski

JButton przyciskLinia = new JButton("LINIA");
this.add(przyciskLinia);
przyciskLinia.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent zdarzenie)
{
String slpx = JOptionPane.showInputDialog("Podaj wsp x poczatku ");  
ltab[ln] = Double.parseDouble(slpx); 
ln=ln+1;
String slpy = JOptionPane.showInputDialog("Podaj wsp y poczatku ");  
ltab[ln] = Double.parseDouble(slpy); 
ln=ln+1;
String slkx = JOptionPane.showInputDialog("Podaj wsp x konca ");  
ltab[ln] = Double.parseDouble(slkx); 
ln=ln+1;
String slky = JOptionPane.showInputDialog("Podaj wsp y konca ");  
ltab[ln] = Double.parseDouble(slky); 
ln=ln+1;
repaint();
}
});

JButton przyciskTrojkat = new JButton("TRÓJKĄT");
this.add(przyciskTrojkat);
przyciskTrojkat.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent zdarzenie)
{
String Ax = JOptionPane.showInputDialog("Podaj wsp x punktu A ");  
ttab[tr] = Double.parseDouble(Ax); 
tr=tr+1;
String Ay = JOptionPane.showInputDialog("Podaj wsp y punktu A ");  
ttab[tr] = Double.parseDouble(Ay); 
tr=tr+1;
String Bx = JOptionPane.showInputDialog("Podaj wsp x punktu B ");  
ttab[tr] = Double.parseDouble(Bx); 
tr=tr+1;
String By = JOptionPane.showInputDialog("Podaj wsp y punktu B ");  
ttab[tr] = Double.parseDouble(By); 
tr=tr+1;
String Cx = JOptionPane.showInputDialog("Podaj wsp x punktu C ");  
ltab[tr] = Double.parseDouble(Cx); 
tr=tr+1;
String Cy = JOptionPane.showInputDialog("Podaj wsp y punktu C ");  
ttab[tr] = Double.parseDouble(Cy); 
tr=tr+1;

repaint();   
}
});

JButton przyciskKwadrat = new JButton("KWADRAT");
this.add(przyciskKwadrat);
przyciskKwadrat.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent zdarzenie)
{
String slpx = JOptionPane.showInputDialog("Podaj wsp x poczatku ");  
ltab[ln] = Double.parseDouble(slpx); 
ln=ln+1;
String slpy = JOptionPane.showInputDialog("Podaj wsp y poczatku ");  
ltab[ln] = Double.parseDouble(slpy); 
ln=ln+1;
String slkx = JOptionPane.showInputDialog("Podaj wsp x konca ");  
ltab[ln] = Double.parseDouble(slkx); 
ln=ln+1;
String slky = JOptionPane.showInputDialog("Podaj wsp y konca ");  
ltab[ln] = Double.parseDouble(slky); 
ln=ln+1;
repaint();   
    
}
});

JButton przyciskOkrag = new JButton("OKRĄG");
this.add(przyciskOkrag);
przyciskOkrag.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent zdarzenie)
{
   
    
}
});

JButton przyciskElipsa = new JButton("ELIPSA");
this.add(przyciskElipsa);
przyciskElipsa.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent zdarzenie)
{
   
    
}
});
// koniec przyciski

// kolory
ButtonGroup grupa = new ButtonGroup();
JRadioButton czarny = new JRadioButton("czarny",false);
grupa.add(czarny);
this.add(czarny);
JRadioButton zielony = new JRadioButton("zielony",false);
grupa.add(zielony);
this.add(zielony);
JRadioButton niebieski = new JRadioButton("niebieski",false);
grupa.add(niebieski);
this.add(niebieski);
JRadioButton bialy = new JRadioButton("biały",false);
grupa.add(bialy);
this.add(bialy);
JRadioButton czerwony = new JRadioButton("czerwony",false);
grupa.add(czerwony);
this.add(czerwony);
JRadioButton zolty = new JRadioButton("żółty",false);
grupa.add(zolty);
this.add(zolty); 
// koniec kolory
} // koniec konstruktora



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

   // siatka
   if (siatka == true)  
    {
   
  Toolkit zestaw = Toolkit.getDefaultToolkit();
  Dimension rozmiarEkranu = zestaw.getScreenSize();
  int wys = rozmiarEkranu.height;
  int szer = rozmiarEkranu.width;
  int j=45 , k=40 , jj=10 ,kk;
  while (k<szer)
  {
  
  Line2D Slinia = new Line2D.Double(k,40,k,wys);
  g2.draw(Slinia);
  kk = k*4;
  String str = ""+ kk;
  g2.drawString("40",40,40);
  g2.drawString("80",80,40);
  g2.drawString("120",120,40);
  g2.drawString(str,kk,40);
  k=k+10;
  }
   
   while (j<wys)
  {
  
  Line2D Slinia = new Line2D.Double(30,j,szer,j);
  g2.draw(Slinia);
  jj = j*2;
  String str = ""+ jj;
  g2.drawString("50",10,50);
  g2.drawString("70",10,70);
  g2.drawString(str,10,jj);
  j=j+10;
  }     
 }

// trojkat
for (int i =0; i < tr;)
{
Line2D liniaAB = new Line2D.Double(ttab[i],ttab[i+1],ttab[i+2],ttab[i+3]);
Line2D liniaBC = new Line2D.Double(ttab[i],ttab[i+1],ttab[i+4],ttab[i+5]);
Line2D liniaAC = new Line2D.Double(ttab[i+2],ttab[i+3],ttab[i+4],ttab[i+5]);
g2.draw(liniaAB);
g2.draw(liniaBC);
g2.draw(liniaAC);
i=i+6;
}
// koniec trojkat

// linia
for (int i =0; i < ln;)
{
Line2D linia = new Line2D.Double(ltab[i],ltab[i+1],ltab[i+2],ltab[i+3]);
g2.draw(linia);
i=i+4;
}
// koniec linia

}

// linia
public int ln=0;
public double[] ltab = new double[1000];
// koniec linia

// trojkat
public int tr=0;
public double[] ttab = new double[1000];
// koniec trojkat

//siatka
boolean siatka=false;

}
// koniec klasy

import javax.swing.;
import java.awt.event.
;
class ProsteOkno extends JFrame
{
public ProsteOkno()
{
Toolkit zestaw = Toolkit.getDefaultToolkit();
Dimension rozmiarEkranu = zestaw.getScreenSize();
int wysEkranu = rozmiarEkranu.height;
int szerEkranu = rozmiarEkranu.width;
setSize(szerEkranu,wysEkranu);
setTitle("Paint in Java");

    // panel rysujacy do ramki

 Panel panel = new Panel(); // panel 
 Container powZawartosci = getContentPane();
 powZawartosci.add(panel, BorderLayout.WEST); 
 
}

}

0
  1. Poproś o listę funkcji które ma spełniać twój program a potem bierz się za pisanie
  2. Zapisuj klasy w różnych plikach
  3. Korzystaj z gotowych klas np. kontenerowych z java.util
  4. Odzielaj kod odpowiedzialny za wygląd od logiki aplikacji.
    5.Komentuj swój kod (np. z pomocą javadoca)
0

stwórz sobie klasę np. Figura (zawierającą dane figury) po której będą dziedziczyć konkretne figury, stwórz również List<Figura> do przechowywania tychże, a póżniej będziesz po prostu przelatywał po tej liście i odrysowywał kolejne figury, to właśnie miał prawdopodobnie na myśli przedmówca mówiąc o oddzieleniu logiki od widoku...

pzdr.

0

1.powinienen tworzyc obiekty i wrzucac je do kontenerow, urzyc podwojnego buforowania, wielowatkowosci, xml...

jak oddzielic, jesli przycisk to wyglad, a zdarzenie to logika to jak ?

a) Jeśli grafika ma opierać się na figurach to zdefinuj interfejs/klasę podstawową który one implementują i stwórz listę
np . LinkedList<IFigura>.
b)Podwójne buforowanie eee nie znam się :) http://java.sun.com/docs/books/tutorial/2d/index.html
c)Wielowątkowość przyda się przy wczytywaniu wielu obrazków lub innych działan które mogą zająć dużo czasu i mogą spowodować efekt zawieszenia aplikacji.
d)XML może posłużyć jako plik konfiguracyjny .
e)Poczytaj trochę o Swingu są na prawdę fajne bajery
http://java.sun.com/docs/books/tutorial/uiswing/index.html
Jak zakumasz o co chodzi to zainstaluj NetBeansa i namaluj sobie aplikację ;) analogicznie jak w Delphi
f)Używaj klasy Button Group to oprogramowania opcji które wzajemnie się wykluczają.
2. Button to wygląd ale listener który do niego podczepiasz stanowi już element logiki twojej aplikacji ,
2.1)Nie musisz robić 10 różnych listenerów jeśli 10 przycisków zmienia tylko kolor pędzla/ołówka ;) .
PS: Że na 2 semestrze jest Java i Pascal [rotfl]

0
haquim napisał(a)

d)XML może posłużyć jako plik konfiguracyjny .

mial zapisywac pliki wektorowo, przechowywac wspolrzedne.

haquim napisał(a)

e)Poczytaj trochę o Swingu są na prawdę fajne bajery
http://java.sun.com/docs/books/tutorial/uiswing/index.html
Jak zakumasz o co chodzi to zainstaluj NetBeansa i namaluj sobie aplikację ;) analogicznie jak w Delphi

od poczatku robie w NetBeansie i nie przypuszczalem, ze da sie tam robic cos takiego, jednak jest to niedozwolone.

haquim napisał(a)

PS: Że na 2 semestrze jest Java i Pascal [rotfl]

hehe nie, nie : pascal, pascal i projekt(pascal99%, java1%, c++1%), c , programowanie obiektowe(java), jak rosjanie uzyja emp to pascal znowu bedzie na topie. [rotfl]

zrobie to co napisaliscie i wrzuce moje wypociny.

0
haquim napisał(a)
  1. Odzielaj kod odpowiedzialny za wygląd od logiki aplikacji.

chodzilo pewnie o MVC
http://www.javaworld.com/javaworld/jw-04-1998/jw-04-howto.html
http://www.leepoint.net/notes-java/GUI/structure/40mvc.html
http://csis.pace.edu/~bergin/mvc/mvcgui.html

pozdrawiam

0
kynix napisał(a)

mial zapisywac pliki wektorowo, przechowywac wspolrzedne.

Jak masz obiekty które reprezentują figury to można je zserializować (domyślnie binarnie) ale można też
do XMLa tylko trzeba używać biblotek
np . http://xstream.codehaus.org/tutorial.html
lub mechanizmów wbudowanych w javę , przykład http://jug.org.ua/wiki/display/JavaAlmanac/Serializing+a+Bean+to+XML

Nie wrzucaj tu całego kodu tylko najlepiej listę klas z opisem a optymalnie to tylko listę pakietów :).
Kodzik zamieść na jakiejś stronce albo generuj sobie javadoca do programu i go zamieszczaj na stronce.

0

class Panel extends JPanel
{
LinkedList figury = new LinkedList();
public Panel()
....

przyciskLinia.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent zdarzenie)
{
String slpx = JOptionPane.showInputDialog("Podaj wsp x poczatku ");
double Ax = Double.parseDouble(slpx);
String slpy = JOptionPane.showInputDialog("Podaj wsp y poczatku ");
double Ay = Double.parseDouble(slpy);
String slkx = JOptionPane.showInputDialog("Podaj wsp x konca ");
double Bx = Double.parseDouble(slkx);
String slky = JOptionPane.showInputDialog("Podaj wsp y konca ");
double By = Double.parseDouble(slky);
Linia linia = new Linia(Ax,Ay,By,Bx,kolor);
figury.add(linia);
repaint();
}
});
...

// linia
Line2D liniaAB = new Line2D.Double(figury.get(1).zwrocAx(),figury.get(1).zwrocAy(),figury.get(1).zwrocBx(),figury.get(1).zwrocBy());
g2.setColor(figury.get(1).zwrocKol());
g2.draw(liniaAB);

// koniec linia , nie moze narysowac tych linii gdyz cannot find symbol methodAx() w klasie java.lang.object;

import java.awt.*;

public class Linia {
double Ax,Ay,Bx,By;
Color kol;

public Linia (double lAx, double lAy,double lBx,double lBy, Color lkol)
{
Ax = lAx;
Ay = lAy;
Bx = lBx;
By = lBy; 
kol = lkol;

}

double zwrocAx()
{
return Ax;
}
double zwrocAy()
{
return Ay;
}
double zwrocBx()
{
return Bx;
}
double zwrocBy()
{
return By;
}
Color zwrocKol()
{
return kol;
}

}

jak zrobic, zeby dalo sie odczytywac z tej listy ???

0

jak zrobic, zeby dalo sie odczytywac z tej listy ???

A co chcesz odczytać ? Figury ?
Użyj kolekcji generycznej dostępne są od jdk 1.5 (w tym roku wyszła 1.6) .
LinkedList<Linia> lista = new LinkedList<Linia>();
bo jeśli używasz LinkedList list = new LinkedList() to zwraca ci figurę jako obiekt klasy Object a w Object nie ma twojej metody ;) .a tak będzie zwracał obiekt klasy Linia.
Pamiętaj że kolekcje są numerowane od 0

0
haquim napisał(a)

jak zrobic, zeby dalo sie odczytywac z tej listy ???

A co chcesz odczytać ? Figury ?
Użyj kolekcji generycznej dostępne są od jdk 1.5 (w tym roku wyszła 1.6) .
LinkedList<Linia> lista = new LinkedList<Linia>();
bo jeśli używasz LinkedList list = new LinkedList() to zwraca ci figurę jako obiekt klasy Object a w Object nie ma twojej metody ;) .a tak będzie zwracał obiekt klasy Linia.
Pamiętaj że kolekcje są numerowane od 0

LinkedList<Linia> lista = new LinkedList(); i tez dziala, jest jakas roznica ?
dorobilem 3 klasy : kwadrat, elipsa, trojkat i 3 listy tego typu, wszystko dziala, tylko wyskakuje
komunikat, ze wykonuje jakies niebezpieczne operacje :-D i nie wiem dlaczego, gdyz nie pisze, wrzucam program, jesli ktos bedzie mial ochote to niech sprawdzi czemu tak sie dzieje, bo to nie na moje progi, musze jeszcze dorobic xml i poprawic, zeby pasek menu byl nad reszta a i nie wiem czemu jak sie wlaczy siatke to nie da sie jej juz wylaczyc.
http://two.xthost.info/kynix/ProgramowanieJava.rar
pozdr.

0

zamiast LinkedList uzyj ArrayList (nie sadze, abys uzywal zawsze iteratorow, a get() przy linked to samobojstwo - poczytaj o implementacji tej metody we wspomnianych kolekcjach)

pozdrawiam

0
kynix napisał(a)

LinkedList<Linia> lista = new LinkedList(); i tez dziala, jest jakas roznica ?
dorobilem 3 klasy : kwadrat, elipsa, trojkat i 3 listy tego typu, wszystko dziala, tylko wyskakuje
komunikat, ze wykonuje jakies niebezpieczne operacje
pozdr.

Sądzę że wykonujesz rzutowanie a to bywa niebezpieczne.

0

zapisanie do pliku

menuPlik.add(new AbstractAction("Zapisz")
{
public void actionPerformed(ActionEvent zdarzenie)
{
try
{
String wejsciowy = JOptionPane.showInputDialog("Podaj sciezke do pliku, gdzie ma byc zapisany");
FileOutputStream file = new FileOutputStream(wejsciowy);
ObjectOutputStream plik = new ObjectOutputStream(file);
plik.writeInt(ln);
plik.writeInt(tr);
plik.writeInt(kw);
plik.writeInt(el);
plik.writeObject(linia);
plik.writeObject(trojkat);
plik.writeObject(kwadrat);
plik.writeObject(elipsa);
file.close();
}

      catch(IOException ex){
      System.out.println("Blad zwiazany z odczytem z pliku. "+ex);}   
     
     }

});

odczytanie z pliku:

menuPlik.add(new AbstractAction("Otworz")
{
public void actionPerformed(ActionEvent zdarzenie)
{
try
{
String wejsciowy = JOptionPane.showInputDialog("Podaj sciezke do pliku, gdzie ma byc wczytany");
FileInputStream file = new FileInputStream(wejsciowy);
ObjectInputStream plik = new ObjectInputStream(file);
ln=plik.readInt();
tr=plik.readInt();
kw=plik.readInt();
el=plik.readInt();

      linia = (ArrayList<Linia>) plik.readObject();
      trojkat = (ArrayList<Trojkat>) plik.readObject();
      kwadrat = (ArrayList<Kwadrat>) plik.readObject();
      elipsa = (ArrayList<Elipsa>) plik.readObject();
      file.close(); 
      }
 
      catch(IOException ex){
      System.out.println("Blad zwiazany z odczytem z pliku. "+ex);}   
     }
 });

i tu wywala blad przy: linia = (ArrayList<Linia>) plik.readObject(); unreported exception in java.lang.classnotfoundexception must be caught or declared to be thrown

jak dodac lapanie tych wyjatkow, zeby dzialalo

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