• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeglądarka zdjęć

Object Storage Arubacloud
+3 głosów
880 wizyt
pytanie zadane 5 kwietnia 2015 w Java przez Valery Użytkownik (510 p.)

Witam. Mam kłopot z jednym z ćwiczeń (ćw1) z javy z poniższego pdfa.

https://drive.google.com/file/d/0B9-UcT5PRFo_Xzl5Y1l3X0RqX1E/view

Udało mi sie wczytac zdjęcie i dodać comboboxa (który z resztą nie ustawia się tam gdzie podaje w setLocation). Zatrzymałem się na podpunkcie 3. Próbując dodać actionlistnera wyskakują mi błędy których do końca nie rozumiem. Nie korzystam z graficznego edytora bo próbuje to zrozumieć od podstaw. Proszę o pomoc co robić dalej

package grafika;

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

public class Grafika extends JFrame   {
    
    Rysunek r; 
    JComboBox jCB1 = new JComboBox();
    
    Image im;
    String nazwa1="C:\\Users\\valery\\Desktop\\JAVA_LAB\\obraz1.JPG";
    String nazwa2="C:\\Users\\valery\\Desktop\\JAVA_LAB\\obraz2.JPG";
    
  Grafika() { 
  
  super("Grafika w aplikacji");
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  setSize(400,250);
  r=new Rysunek();
  r.setDoubleBuffered(true);
  add(r);
  setVisible(true);
 }
 
 class Rysunek extends JPanel  {
     
     JPanel j1 = new JPanel();
     JComboBox jcb1 = new JComboBox();
     
     Rysunek(){
         
     add(j1); j1.add(jcb1); 
     jcb1.setLocation(30, 40);
     jcb1.addItem("Zdjecie 1");   jcb1.addItem("Zdjecie 2");  
     j1.setVisible(true);
   
    };
 @Override 
 public void paintComponent(Graphics g){

 super.paintComponent(g);
 im = Toolkit.getDefaultToolkit().getImage(nazwa2);
 g.drawImage(im, 170, 40, this);
   }
} 
    public static void main(String[] args) {
        Grafika a = new Grafika();
        
    }
}

 

4 odpowiedzi

+1 głos
odpowiedź 6 kwietnia 2015 przez Mateusz Błaszczak Użytkownik (760 p.)
wybrane 6 kwietnia 2015 przez Valery
 
Najlepsza
  class Rysunek extends JPanel {

    JPanel j1 = new JPanel();
    JComboBox jcb1 = new JComboBox();

    Rysunek() {
      im = Toolkit.getDefaultToolkit().getImage(nazwa1);
      setLayout(null);
      j1.setLayout(null);
      add(j1);
      j1.add(jcb1);
      j1.setBounds(0, 0, 110, 110);
      jcb1.setBounds(30, 40, 80, 20);
      jcb1.addItem("Zdjecie 1");
      jcb1.addItem("Zdjecie 2");
      j1.setVisible(true);

      jcb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
          Object ob = jcb1.getSelectedItem();
          if (ob == "Zdjecie 1") {
            System.out.println("wybrano zdjecie1");
            im = Toolkit.getDefaultToolkit().getImage(nazwa1);
            repaint();
          } else if (ob == "Zdjecie 2") {
            System.out.println("wybrano zdjecie2");
            im = Toolkit.getDefaultToolkit().getImage(nazwa2);
            repaint();
          }
        }
      });
    }

    @Override
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      //im = Toolkit.getDefaultToolkit().getImage(nazwa1);
      
      g.drawImage(im, 170, 40, this);
    }
  }

Błedy:
1.
im = Toolkit.getDefaultToolkit().getImage(nazwa1); <- to w meteodzie paintComponent czyniło że zawsze malowałeś obrazek z pod linku nazwa1.
2.
Metode paintComponent nadpisałeś w klasie Rysunek a nie panel więc wykonywałes repainta na j1 a nadpisałeś metode Rysunek.
chya że chciałes ten panel przemalowywać to wtedy:
 

    Rysunek() {
      im = Toolkit.getDefaultToolkit().getImage(nazwa1);
      j1 = new JPanel() {
      @Override
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(im, 170, 40, this);
      }
    };
      setLayout(null);
      j1.setLayout(null);
      add(j1);
      j1.add(jcb1);
      j1.setBounds(0, 0, 210, 210);
      jcb1.setBounds(30, 40, 80, 20);
      jcb1.addItem("Zdjecie 1");
      jcb1.addItem("Zdjecie 2");
      j1.setVisible(true);

      jcb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
          Object ob = jcb1.getSelectedItem();
          if (ob == "Zdjecie 1") {
            System.out.println("wybrano zdjecie1");
            im = Toolkit.getDefaultToolkit().getImage(nazwa1);
            j1.repaint();
          } else if (ob == "Zdjecie 2") {
            System.out.println("wybrano zdjecie2");
            im = Toolkit.getDefaultToolkit().getImage(nazwa2);
            j1.repaint();
          }
        }
      });
    }

  }

Tylkoi pamieteja że :
g.drawImage(im, 170, 40, this);// 0<170<220 &&0<40<220
j1.setBounds(0, 0, 210, 210);//jeśli ustawisz tu mniejszy zakres niz punkt od którego zacyznasz rysowac to nie bedizesz widizał tego.

komentarz 6 kwietnia 2015 przez Valery Użytkownik (510 p.)
Dzięki wielkie
+1 głos
odpowiedź 5 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)
edycja 5 kwietnia 2015 przez Mateusz Dalgiewicz

Witaj,

Aby dodać obsługe klawisza w Javie musisz zaimplementować interfejs ActionListener. Poniżej przykład jak to zrobić najprościej. A jeżeli masz problem z konkretnym przypadkiem wstaw swój kod ActionListenerem to zobaczymy co to za błędy


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyFrame extends JFrame {

	private JButton button;
	
	public static void main(String[] args){
		new MyFrame();
	}
	
	public MyFrame(){
		super("Moj panel");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(400,400);
		setVisible(true);
		initComponent();
	}
	
	public void initComponent(){
		
		button = new JButton("Wcisnij mnie!");
		
		button.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
					buttonFunction();
			}
			
		});
		
		this.add(button);
	}
	
	public void buttonFunction(){
		System.out.println("Wukonuje swoje dzialanie!");
	}
}

 

+1 głos
odpowiedź 5 kwietnia 2015 przez Mateusz Błaszczak Użytkownik (760 p.)

To co moge Ci powiedziec to tylko co do ustawienia lokalizacji.
 

  class Rysunek extends JPanel {

    JPanel j1 = new JPanel();
    JComboBox jcb1 = new JComboBox();

    Rysunek() {

      setLayout(null);
      j1.setLayout(null);
      add(j1);
      j1.add(jcb1);
      j1.setBounds(0, 0, 100, 100);
      jcb1.setBounds(30, 40, 80, 20);
      jcb1.addItem("Zdjecie 1");
      jcb1.addItem("Zdjecie 2");
      j1.setVisible(true);

    }

problem polegał na tym że Jpanel domyślnie ma layout, gdy go usuniesz musisz się sam zatroszczyć o punkt początkowy i rozzmiar dla komponentu.- Ja prefruje takie rozwiazanie
Jednak jeśli wolisz bawic się z layoutem to poczytaj o nim.


Nie dokonca rozumiem czemu do JPanel dodajesz JPanel ale może potrzebujesz później tego.

rady
1. Rozbij projekt nawet mały na osobne class'y(osobno main, panel, frame class'y poszczególnych obiektów)
2. naztwaj zmienne po ludzku.
3.mimo wszystko po ; enter. czytelniejsze to jest.
4.Fragment kodu chociaż o który pytasz i kod błedu podaj.(bez tego ciezlko co kolwiek powiedzieć)


powodzenia

komentarz 5 kwietnia 2015 przez Valery Użytkownik (510 p.)
Dzięki za rady, ogólnie zazwyczaj zachowuje standardy czystego kodu ale ten przykład jest w miarę prosty więc sobie odpuściłem.
komentarz 5 kwietnia 2015 przez Mateusz Błaszczak Użytkownik (760 p.)
Mimo wszystko bawet przy głupich 5linijkowcach zachowuj te standardy, wejdzie w krew i odruchowo bedizesz tak robił nie musząc tego piilnowac.
0 głosów
odpowiedź 5 kwietnia 2015 przez Valery Użytkownik (510 p.)

Ok udało mi się zrobić actrionlistnera, co teraz mam zrobić aby przy wyborze z comboboxa zmieniał się rysunek? 

​package grafika;

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


public class Grafika extends JFrame   {
    
    Rysunek r; 
    Image im;
    String nazwa1="C:\\Users\\valery\\Desktop\\JAVA_LAB\\obraz1.JPG";
    String nazwa2="C:\\Users\\valery\\Desktop\\JAVA_LAB\\obraz2.JPG";
    
  Grafika() { 
  
  super("Grafika w aplikacji");
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  setSize(400,250);
  r=new Rysunek();
  r.setDoubleBuffered(true);
  add(r);
  setVisible(true);
 }
 
 class Rysunek extends JPanel  {
     
     JPanel j1 = new JPanel();
     JComboBox jcb1 = new JComboBox();
     
 
     Rysunek(){
         
    setLayout(null);
    j1.setLayout(null);
    add(j1);
    j1.add(jcb1);
    j1.setBounds(0, 0, 110, 110);
    jcb1.setBounds(30, 40, 80, 20);
    jcb1.addItem("Zdjecie 1");
    jcb1.addItem("Zdjecie 2");
    j1.setVisible(true);
    
        jcb1.addActionListener(new ActionListener(){
 
            @Override
            public void actionPerformed(ActionEvent e) {
                   Object ob = jcb1.getSelectedItem();
                   
                if (ob=="Zdjecie 1"){
                        System.out.println("wybrano zdjecie1");
                   im = Toolkit.getDefaultToolkit().getImage(nazwa1); 
                   j1.repaint();
                   }
                   else if (ob=="Zdjecie 2") {
                       System.out.println("wybrano zdjecie2");
                   im = Toolkit.getDefaultToolkit().getImage(nazwa2); 
                   j1.repaint();
                   }
                  }
        });
           }

 @Override 
 public void paintComponent(Graphics g){
super.paintComponent(g);
 im = Toolkit.getDefaultToolkit().getImage(nazwa1);
 g.drawImage(im, 170, 40, this);
   }
} 
    public static void main(String[] args) {
        Grafika a = new Grafika();
        
    }
}

Podobne pytania

0 głosów
2 odpowiedzi 1,905 wizyt
pytanie zadane 9 grudnia 2015 w JavaScript przez garyore Początkujący (370 p.)
+2 głosów
2 odpowiedzi 153 wizyt
0 głosów
1 odpowiedź 583 wizyt
pytanie zadane 5 maja 2023 w Systemy operacyjne, programy przez 4chan Nowicjusz (120 p.)

92,628 zapytań

141,488 odpowiedzi

319,853 komentarzy

62,009 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...