Odświeżanie JPanel / JFrame

0

Witam jestem początkującym programistą JAVA ;-P . I już natrafiłem na … /jak dla mnie / :-/ .. na poważny problem ;/ a mianowicie w żaden sposób nie umiem odświeżyć zawartości JPanel
W którym znajdują się np. przyciski JButton i inne komponenty programu. Ogólnie rzecz biorąc chciałbym by pod przyciskiem menu JMenuItem elemOdsiwez = new JMenuItem("Odswiez"); znajdowała się akcja odświeżająca JPanel. Starałem się już zrobić tak

panel.removeAll();
panel.reprint();

// wczytanie na nowo Panel;

panel.revalidate();
panel.repaint();

jednak taka typ akcja powodowała że JPanel się odświeżał ! ale niestety jego komponenty znikały i pojawiały się dopiero na stałe gdy wskazywało się na nie myszką [???] [glowa] .

Będę Wdzienczny [browar] za wszelką pomoc typu jakiej użyć składni, czy jak urządzić program by odświeżania Panel było możliwe. Wiem że tematy podobne były ale w nich nie znalazłem rozwiązania gdyż opisywały one sposób które już używałem.

Proszę też o nie odsyłanie mnie do gogle bo szukałem długo nim zdecydowałem się zawracać „dupę” komuś na forum. I wszytkę wątki związane z odświeżaniem JPanel prowadzą mnie do tego samego.

Pozdrawiam.

0

no revalidate/repaint są właściwym rozwiązaniem. napisz co chcesz dokł. na tym panelu odświeżać?
przykład poniżej

package sal;

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

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Okienko extends JFrame{
	JMenuBar menu;
	JMenu plik;
	JMenuItem odswiezItem;
	Panelek panel;
	int licznik=0;
	
	
	public Okienko(){
		setTitle("Okineko");
		setSize(400,400);
		setLocation(200, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel=new Panelek();
		menu=new JMenuBar();
		plik=new JMenu("Plik");
		odswiezItem=new JMenuItem("Odsiwez");
		
		plik.add(odswiezItem);
		menu.add(plik);
		setJMenuBar(menu);
		setLayout(new BorderLayout());
		getContentPane().add(panel);
		
		odswiezItem.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				licznik++;
				panel.revalidate();
				panel.repaint();
				
			}
			
		});
		
	}
	
	class Panelek extends JPanel{
		public void paint(Graphics g){
			super.paint(g);
			g.drawString("Wywoalnie: "+licznik, 10, this.getHeight()/2);
			
		}
	}
	public static void main(String[] args) {
		new Okienko().setVisible(true);
	}
}
0

JPanel czerpie cześć ze swoich obiektów z Obiektowej bazy danych. np : Przycisków JButton, chodzi o to że gdy ktoś doda przycisk do bazy to by muc odświeżyć panel by te nowe przyciski się pokazały. Bo jak na razie odświeżają się dopiero po ponownym uruchomieniu programu. lub w sposób wcześniej przeze mnie opisany.

Dziękuje za zainteresowanie problemem…. [soczek] .
</url>

0

Dziękuje za odpowiedz, jednak czy jest możliwość by odświeżyć tak zbudowany program. Ten powyżej działa ale zajmie mi pewnie trochę czasu przełożenie kodu. I szczerze mówiąc taką hierarchie bardziej rozumiem. W ogóle świetnie by było jak by można było odświeżać przez menu wbudowane w ( miejsce /1.1.1 w kodzie.

public class Programu
{

   public static void main(String[] args)
   {  
	RamkaGlowna ramka = new RamkaGlowna();
	ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	ramka.show();

// 1.1.1
   }
 
}



class RamkaGlowna extends JFrame
{
	
	public RamkaGlowna()
{
	final SZYBAPierwsza panel = new SZYBAPierwsza();

// Tu jest menu lecz je usunąłem bo zajmuje 1,5 strony i w nim ma być ten guzik od odświeżania JPanel


	Container powZawartosc = getContentPane();
	powZawartosc.add(panel,BorderLayout.CENTER);
				
	setSize(rozmiar.szerokosc,rozmiar.wysokosc);
	setLocation(350,250);
	setTitle("Kalkulator");
}
}


class SZYBAPierwsza extends JPanel
{
// a tu guziki czytane z bazy i one się maja odświeżyć

}
0

Ok już działa po podpowiedziach Shimmi uświadomiłem sobie że to nie wina odświeżania tylko ponownego odczytu z bazy. i tak zrobiłem odświeżanie jak podpowiedział Shimmi a ponadto dorzuciłem w akcji guzika cześć odpowiedzialna za ponowne odczytanie z bazy wszytko działa jak na razie :-) będe to jeszcze dziś testował jak nie pojawi się wciągu paru dni żaden problem któryh tu opisze temat można uznać za zamknięty :-) podsumowując działa to tak :

JMenuItem elemOdsiwez = new JMenuItem("Odswiez"); 
  elemOdsiwez.setMnemonic('O');
  elemOdsiwez.addActionListener(new 
		  	ActionListener()
	{
	   public void actionPerformed(ActionEvent zdarzenie)
	   {
			//odswierzanie
		   
		   System.out.println("W1W");
	
		   
		   panelik.revalidate();
		   panelik.repaint();
		   panelik.wydrukB();
		  
		  // JLabel j = new JLabel(".");
		   //panelik.add(j);

	   }
	});
  menuWidok.add(elemOdsiwez);

gidze panelik.wydrukB(); tu wydruk bazdy.

pozdrawiam i dziękuje Shimmi

0

może to pomoże:

public class Okienko extends JFrame{
	JMenuBar menu;
	JMenu plik;
	JMenuItem odswiezItem;
	Panelek panel;
	public Okienko(){
		setTitle("Okineko");
		setSize(400,400);
		setLocation(200, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		panel=new Panelek();		
		menu=new JMenuBar();
		plik=new JMenu("Plik");
		odswiezItem=new JMenuItem("Odsiwez");	
		plik.add(odswiezItem);
		menu.add(plik);
		setJMenuBar(menu);
		setLayout(new BorderLayout());
		getContentPane().add(panel);		
		odswiezItem.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
						panel.odswiez();		
			}			
		});		
	}
	class Panelek extends JPanel{
		List<JButton> listaGuzikow;
		int szer=1;	
		public Panelek(){
			listaGuzikow=new ArrayList<JButton>();
			listaGuzikow.add(new JButton("X"));
			setLayout(new GridLayout(1,szer));
			add(listaGuzikow.get(0));		
		}
		public void paint(Graphics g){
			super.paint(g);
			//g.drawString("Wywoalnie: "+licznik, 10, this.getHeight()/2);			
		}
		public void odswiez(){
			szer++;
			listaGuzikow.add(new JButton("O"));
			panel.setLayout(new GridLayout(1,szer));
			System.out.println(panel.getLayout());
			for(int i=0;i<listaGuzikow.size();i++){
				panel.add(listaGuzikow.get(i));	
				}
			this.revalidate();
			this.repaint();
		}
	}
	public static void main(String[] args) {
		new Okienko().setVisible(true);
	}
}
0

Dzięki przetestuje jeszcze ten sposób.

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