Problem z przesyłaniem wartości do metody paint

0

Witam!
Mam problem z przesłaniem wartości obraz0 do metody panit, by wyświetlić obraz w nowym oknie JDialog.

 class Wyswietlacz extends JDialog{
    public Wyswietlacz(Frame parent, boolean modal, BufferedImage obraz0){
        super(parent,modal);
        setBackground(Color.white);
   }  
    public void paint(Graphics g){
    g.drawImage(obraz0, 0, 0, null);
    g.dispose();       
    }   
 }

Wywołuje to:

            JFrame jframe = new JFrame();
            jframe.setVisible(false);
            Wyswietlacz p1 = new Wyswietlacz(jframe,true,obraz1);       
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            p1.setVisible(true); 
            p1.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent we) {
                    we.getWindow().dispose();      
                }
            }); 
            jframe.dispose();

Wszelka pomoc mile widziana.

0

W klasie Wyswietlacz zapisz gdzieś ten obraz:

class Wyswietlacz extends JDialog{
    BufferedImage obraz0;
    public Wyswietlacz(Frame parent, boolean modal, BufferedImage obraz0){
        super(parent,modal);
        setBackground(Color.white);
        this.obraz0 = obraz0;
   }  
    public void paint(Graphics g){
    g.drawImage(obraz0, 0, 0, null);
    g.dispose();       
    }   
 }

Powinno działać (jak zawsze piszę z palca).
Pozdrawiam

0

i nie paint tylko pintComponent! bylo juz tyle razy...
np tu: http://4programmers.net/Forum/342102

pozdrawiam

0

Mam troszke problem ze znikaniem grafiki w tabach, proszę o pomoc:

Mam główną klase KlasaMain i tam też mam całe GUI (tu poakzuję część z tabami:

JPanel panelTabs = new JPanel();
	    panelTabs.setLayout(new BorderLayout());
	    panelTabs.setBounds(0, 0, 692, 250);
	    
		tabs = new JTabbedPane(); 
			
			JPanel tabPanel1 = new JPanel(new BorderLayout());	
			ImageIcon icon1 = new ImageIcon("img/tab-probka.gif");
			tabPanel1.setBackground(Color.BLACK);
			tabs.addTab("Próbka do Modyfikacji", icon1, tabPanel1, "Próbka dźwiękowa do usunięcia zakłóceń.");
			tabs.setMnemonicAt(0, KeyEvent.VK_1);
			
			JPanel tabPanel2 = new JPanel(new BorderLayout());
			ImageIcon icon2 = new ImageIcon("img/tab-szum.png");
			tabPanel2.setBackground(Color.BLACK);
			tabs.addTab("Próbka Szumu", icon2, tabPanel2, "Zakładka z próbką szumu.");
			tabs.setMnemonicAt(1, KeyEvent.VK_2);
			
				
		tabs.setOpaque(true);
        panelTabs.add(tabs);

W klasie KLasaDisplay mam metody paint() i paintCOmponent():

public void paint(Graphics g) { 
super.paint(g);
g.setColor(Color.black);
g.fillRect(0, 0, displayTabs.getWidth(), displayTabs.getHeight());
g.setColor(Color.green);
g.drawLine(0, panelCenterHeightI, panelWidthD.intValue(), panelCenterHeightI);
}
 
public void paintComponent(double array[]) {
		g = displayTabs.getComponentAt(displayTabs.getSelectedIndex()).getGraphics();
		//super.paintComponent(g);
		g.setColor(Color.green);
   		for (int i = 0; i < array.length-1; i++){
   			Integer valueI = (int) array[i];
   			g.drawLine(
						i,
						panelCenterHeightI,
						i,
						panelCenterHeightI - valueI //"-" w góre
   			);
   		}
}

To co narysuje przez paint() wstepnie chce miec to jako domyslne - na razie to tam upchnolem wstępnie.
Ale jak mam taby to chce za pomoca tablicy wyrysowywac potem wykres w tabie zależnie od wartosci tablicy. I analogicznie w innych tabach ( też z jakichś arrayow ).

No i PROBLEM jest wtedy, ze jak podam mu tablice do narysowania paintComponent - to ją defacto narysuje ale potem po zmianie tabsów albo przy minimalizacji etc - wykresy z tabów znikają...
Prosze o pomoc.

0

ogolna zasada jest taka, ze nie przeslania sie paint.
sproboj

pozdrawiam

0

Wywalilem calkiem paint() i dzialam tylko na paintComponent()
Wszystko wyswietla kiedy chcę tylko jak juz zmieniam taba albo minimalizuje to wszystko sie wymazuje
i zostaje tlo ustawione w momencie tworzenia taba.
Probowalem tez przedefiniowac metode repaint() w klasie gdzie leży paintComponent() i sie okazuje ze z neigo nie korzysta gdy wykonuje akcje powodujace wymazywanie - bo wydawalo mi sie ze zamazywanie wynika z domyslnej metody repaint() na takich akcjach.
Probowalem też użyć protected przy class extend JPanel, JTabedPane i inne,
oraz przez przedefinioowanie zmiennej graphics w paintComponent():
Graphics2D g2 = (Graphics2D) g;
Ale ciagle to samo. Pomóżcie.

0

Ok kolega mi podpowiedział jak to zrobić i udalo sie ale troche tak po zasrańsku zrobione jest, ale działa...
Nie śmiejcie się bo jeszcze z obiektami troche mam problemy.

KlasaMain
	KlasaDisplay wykres0 = new KlasaDisplay();
	KlasaDisplay wykres1 = new KlasaDisplay();
	KlasaDisplay wykres2 = new KlasaDisplay();
//gdzieś tam w initGUI:
        tabs.addTab("Próbka do Modyfikacji", icon0, wykres0, "Próbka dźwiękowa do usunięcia zakłóceń.");
//...analogicznie pozostale 2
//i na koncu podaje referencje do KlasaDisplay i tam wezme stąd tablice
	public void setArrayFromRead(double[] parametr){
	if ((file[0] != null) && (tabs.getSelectedIndex() == 0)){
       		obiektDisplay.setObiektInDisplay(this, wykres0);//
    	} else if ((file[1] != null) && (tabs.getSelectedIndex() == 1)){
    		obiektDisplay.setObiektInDisplay(this, wykres1);
    	} else if ((file[2] != null) && (tabs.getSelectedIndex() == 2)){
    		obiektDisplay.setObiektInDisplay(this, wykres2);
    	}


KlasaDisplay extends JPanel{   // (czyli poprzednie wykresy sa JPanelami)
//odbieram obiektMain i odrazu stworzone tam obiekty wykresy...
	public void setObiektInDisplay(KlasaMain parametr, KlasaDisplay wykres){
		obiektMain = parametr; //referencja dla tej klasy
    	if (obiektMain.fileType == "audio"){
    		wykres0 = wykres;
    		wykres0.conformWave(obiektMain.arrayDoubleData);
    	} else if (obiektMain.fileType == "noise"){
    		wykres1 = wykres;
    		wykres1.conformWave(obiektMain.arrayDoubleData);
    	} else if (obiektMain.fileType == "result"){
    		wykres2 = wykres;
    		wykres2.conformWave(obiektMain.arrayDoubleData);
    	}

leci do conformwave i stamtąd jeszcze tylko przeksztalcam do jednej uniwersalnej tablicy i daje super.paint() zeby od razu wyswietlilo, a nie dopiero przy jakies akcji i po tym juz wszystko dziala w paincie jak należy "na jednej tablicy".
Nierozumiem tylko do konca skad te wykresy biora dane w paint() przy odswiezaniu.
Uzylem tylko ich na poczatku do rzucenia tablicy wzietej z KlasaMain na metode Conform w KlasaDisplay ktora ma uniwersalna dla wszystkich wykresow tablice. Mimo to kazdy obiekt JPanel uzywa uniwersalnego arraya ktory ma zawsze te wartosci co trzeba. Nie wczytuje wartosci ponownie do tego uniwerslanego arraya z każdą akcją (tj repaint czy paint) tylko zwyczajnie wyswietlam wykres.

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