problem z image i wczytywaniem jpg w javie

0

na wstepie powiem ze jestem troche zielony z javy ale staram sie szuakc różnych rozwiązań.. niestety stanąłem w martwym punkcie:

stworzyłem sobie przykładową aplikacje która zawiera pole do wpisu ciągu znaków, przycisk i pole label x2... zadaniem programu ma byc odczyt znaków jakie zostana wpisane w textfilda i po nacisnieciu buttona wstawienie okreslonego napisu do pierwszego labela a obrazka/ki jpg do drugiego...

jak na razie zrobiłem to dla pierwszego znaku ale w koncowej wersji program ma odczytac kazdy znak i po kolei i zamieniac go na obrazek a nastepnie wyświetlać go w labelu np.

wpisze w pole 21+45= i po naciśnieciu buttona kazdy ze znaków czyli po kolei 2, 1,+,4,5,= zostanie wyswietlony w formie obrazka jpg...

to co do tej pory zrobiłem (na próbe dla 2 znaków + i - czy w ogóle działa) :


import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
import java.lang.String;  
import javax.swing.*;
import javax.swing.ImageIcon;

public class Nazwa implements ActionListener
{


	JButton but2;
	JTextField fil3;
	JLabel lab1; 
	JLabel lab2;
	
	 
	 
	public Nazwa()
	{
		JFrame.setDefaultLookAndFeelDecorated(true); //skorki
		JFrame fr= new JFrame ("zamiana ciągu znaków na obrazki");
		Container con = fr.getContentPane();
		con.setLayout(new GridLayout(4,1));
		
		
		fil3 = new JTextField();
		con.add(fil3);
		
		but2 = new JButton("Show");	
		but2.addActionListener(this);						
		con.add(but2);
		
		lab1 = new JLabel("x");
		con.add(lab1);
		
		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fr.pack();
		fr.setSize(400,400);
		fr.setLocationRelativeTo(null);
		fr.setResizable(false);
		fr.setVisible(true);
		
	}

public void actionPerformed(ActionEvent ev)
	{
		String label = ev.getActionCommand();
		if (label.equals("Show"))
		{
			try 
			{
				String a = fil3.getText();
				char znak = a.charAt(0);
						    
				
				switch(znak)
				{
				case '+': lab1.setText("dodawanie +"); 
				    lab2 = new JLabel(new ImageIcon("plus.jpg"),JLabel.CENTER);	 
				    break;
				    
				case '-': lab1.setText("minus -");
				    lab2 = new JLabel(new ImageIcon("minus.jpg"),JLabel.CENTER);
				    break;
				};
				

		}
		
			catch (NumberFormatException e)
			{
				System.out.println("Blad argumentow!? Wpisz poprawne wartosci!");
			} 
		} 
	}

	public static void main(String args[]) throws IOException
	{
		Nazwa f = new Nazwa();
	}
}

problem w tym ze napis do jednego labela jest wstawiany ale obrazek do drugiego juz nie...

czy moze ktos mi pomóc w realizacji tego podprogramu? jest to czesc wiekszej aplikacji ale ja mam sie zająć tylko tym... nie znam sie aż tak na javie a wszelkie pomysły chyba juz wyczerpałem...

z góry dziękuje za pomoc :)

0

W lab1 zmienia Ci się tekst bo go umieściłeś w głównym kontenerze okna, a obrazka nie widać bo lab2 nie został tam umieszczony. Przy reakcji na zdarzenie nie powinieneś tworzyć nowego obiektu lab2, tylko zmieniać mu obrezek przez metodę setIcon.

0

ale czy potem bede mógł wczytywać kolejne obrazki do juz istniejących tak aby stworzyły ciągła linie jak w przykładzie który przedstawiłęm?

ps. jak użyć wiec do mojego przykładu metody którą mi wskazałeś?

dziekuje za pomoc...

0

Jeśli chcesz dodawać kolejne obrazki to powinieneś tworzyć nowy JLabel z kolejnym obrazkiem i oczywiście dodawać go (metodą add) do kontenera (np. JPanela) z odpowiednio ustawionym layoutem.

Co do ustawiania obrazka to robisz to tak:
w konstruktorze:
lab2 = new JLabel();
add(lab2);
w obsłudze zdarzenia:
lab2.setIcon(new ImageIcon("plus.jpg"));

0

ok juz rozumiem :) (chyba ;) .... po prostu jedno doświadczenie wiecej...)

ps. mam jeszcze jedno pytanko od nośnie ostatniej wypowiedzi.. piszesz ze powienienm dodawac nowy obiekt do odpowiednio zdefiniowanego jpanela z zdefiniowanym layoutem... ale jest pewien problem ponieważ ciąg znaków nie zawsze bedzie taki sam... jak uzależnic ilośc kolumn od ilości znaków które będą pobrane z przykładowego textfielda?

ps2. wielkie dziekuje za pomoc... :)

0

przerobiłem tak jak pisałes swój kod i na razie mam coś takiego :

import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
import java.lang.String;  
import javax.swing.*;
import javax.swing.ImageIcon;

public class Nazwa implements ActionListener
{


	JButton but2;
	JTextField fil3;
	JLabel lab1; 
	JLabel lab2;
	JLabel lab3;	
	JLabel lab4;	 
	JLabel lab5;
	JLabel lab6;
	JLabel lab7;
	JPanel panel;	
	
	 
	public Nazwa()
	{
		JFrame.setDefaultLookAndFeelDecorated(true); //skorki
		JFrame fr= new JFrame ("zamiana ciągu znaków na obrazki");
		
		
		
		
		Container con1 = fr.getContentPane();
		con1.setLayout(new GridLayout(5,1));
		
		fil3 = new JTextField();
		con1.add(fil3);
		
		but2 = new JButton("Show");	
		but2.addActionListener(this);						
		con1.add(but2);
		
		lab1 = new JLabel("");
		con1.add(lab1);
		lab2 = new JLabel("");
		con1.add(lab2);
		
		
		
		
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(1,5));
		con1.add(panel);

		lab3 = new JLabel("z");
		panel.add(lab3);
		lab4 = new JLabel("x");
		panel.add(lab4);
		lab5 = new JLabel("c");
		panel.add(lab5);
		lab6 = new JLabel("v");
		panel.add(lab6);		
		lab7 = new JLabel("b");
		panel.add(lab7);




		
		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fr.pack();
		fr.setSize(400,400);
		fr.setLocationRelativeTo(null);
		fr.setResizable(false);
		fr.setVisible(true);
		
	}

public void actionPerformed(ActionEvent ev)
	{
		String label = ev.getActionCommand();
		if (label.equals("Show"))
		{
			try 
			{
				String a = fil3.getText();
				char znak = a.charAt(0);
				//char znak2 = a.charAt(1);
		      //char znak3 = a.charAt(2);

				
				switch(znak)
				{
				case '+': lab1.setText("dodawanie"); 
				   lab2.setIcon(new ImageIcon("plus.jpg"));
				    break;
				case '-': lab1.setText("minus");
				    lab2.setIcon(new ImageIcon("minus.jpg"));
				    break;
				case '/': lab1.setText("/"); 
				   lab2.setIcon(new ImageIcon("dzielenie.jpg"));
				    break;
				case '*': lab1.setText("*");
				    lab2.setIcon(new ImageIcon("mnozenie.jpg"));
				    break;
				case '(': lab1.setText("(");
				    lab2.setIcon(new ImageIcon("nawiaslewy.jpg"));
				    break;
				case ')': lab1.setText(")");
				    lab2.setIcon(new ImageIcon("nawiasprawy.jpg"));
				    break;
				    
				case '0': lab1.setText("0");
				    lab2.setIcon(new ImageIcon("0.jpg"));
				    break;
				case '1': lab1.setText("1"); 
				   lab2.setIcon(new ImageIcon("1.jpg")); 
				    break;
				case '2': lab1.setText("2");
				    lab2.setIcon(new ImageIcon("2.jpg"));
				    break;
				case '3': lab1.setText("3");
				    lab2.setIcon(new ImageIcon("3.jpg"));
				    break;
				case '4': lab1.setText("4");
				    lab2.setIcon(new ImageIcon("4.jpg"));
				    break;				
				case '5': lab1.setText("5");
				    lab2.setIcon(new ImageIcon("5.jpg"));
				    break;				
				case '6': lab1.setText("6");
				    lab2.setIcon(new ImageIcon("6.jpg"));
				    break;				
				case '7': lab1.setText("7");
				    lab2.setIcon(new ImageIcon("7.jpg"));
				    break;				
				case '8': lab1.setText("8");
				    lab2.setIcon(new ImageIcon("8.jpg"));
				    break;
				case '9': lab1.setText("9");
				    lab2.setIcon(new ImageIcon("9.jpg"));
				    break;				
				};
				

		}
		
			catch (NumberFormatException e)
			{
				System.out.println("Blad argumentow!? Wpisz poprawne wartosci!");
			} 
		} 
	}

	public static void main(String args[]) throws IOException
	{
		Nazwa f = new Nazwa();
	}
}

jest to na razie zczytywanie jednego znaku... w jaki sposób teraz sposób zrobic aby aplikacja leciała po for-rze i sprawdzała kolejne znaki a na koncu kazdego cyklu dostawiała kolejny label?

przypuścmy ze znaków nie bedzie wiecej niz 20...
wiem ze po tym co na razie mam, gdybym dorobił for-a to aplikacja nadpisywała by mi tylko poprzednia "ikone"... a nie dostawiała kolejnego labela po 1 przejsciu... + uzależnienie od ilości znaków dla layouta...

byłbym wdzięczny za dalszą pomoc... a za to co do tej pory bardzo dziekuje :)

0

pomoze ktoś w rozwiązaniu tego problemu?

z góry dziekuje :))))

0

Na frame'ie dajesz JPanel z FlowLayout. Na tym panelu będziesz umieszczał etykiety z obrazkami. Umieszczanie etykiet wykonaj tak:

  • utwórz nową etykietę z odpowiednim obrazkiem
  • dodaj do panela
  • wywołaj metodą validate() dla panela, możliwe, że bez niej nie będziesz widział efektów na GUI

Nie musisz parsować całego wprowadzanego tekstu, możesz reagować na naciskanie klawiszy. Jeśli jednak chcesz parsować znak po znaku to:

  • String ma metodę charAt(int pos) - zwraca znak na pozycji
  • length() - długość tekstu
  • jeśli chcesz wyczyścić panel wywołujesz removeAll()

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