Obraz nie wypełnia całej ramki

0

Witam,
głowię się z tym już od dłuższego czasu, a bez tego nie ruszę dalej mojej pracy. Problem polega na tym, że obraz, który ładuję do panelu nie wypełnia całej ramki:

http://i39.tinypic.com/125mc1z.png

Widać to przy krawędziach, gdzie wszędzie powinna być kratka.

Kod odpowiedzialny za program:

public class MenuFrame extends JFrame {
JPanel panelglowny = new JPanel();
	public MenuFrame() 
        {
            
		super("Funkcja kwadratowa");
                add(panelglowny);
this.addMouseListener(new java.awt.event.MouseAdapter() 
       {
        public void mouseClicked(java.awt.event.MouseEvent evt) 
        {
          if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>185 && evt.getY()<223)
            {
                          JPanel moj_profil = new Moj_Profil();
                                     
                                     panelglowny.removeAll();    //  Najlepiej by było, gdyby usunąć panelglowny.  ale niestety nie będzie się
                                     panelglowny.add(moj_profil); // ładować
                                     panelglowny.revalidate();
                                     panelglowny.repaint();          

            }
        }
        
       });
		JPanel obrazPanel = new Menu();
		panelglowny.add(obrazPanel);  // Jeśli usunę panelglowny.   to przerwa zniknie, niestety MouseListener przestaje działać
                
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setResizable(false);
		pack();
		setVisible(true);
	}

        
}

Kod, do którego odnosi się JPanel obrazPanel = new Menu(); :

public class Menu extends JPanel {

	private BufferedImage tlomenu;
        

	public Menu() {
		super();

		File imageFile = new File("menu.png");
		try {
			tlomenu = ImageIO.read(imageFile);
		} catch (IOException e) {
			System.err.println("Blad odczytu obrazka");
			e.printStackTrace();
		}

		Dimension dimension = new Dimension(tlomenu.getWidth(), tlomenu.getHeight());
                

		
		setPreferredSize(dimension);
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(tlomenu, 0, 0, this);
                
	}
}

Zależało mi na tym sposobie, ponieważ umożliwia on nakładanie na siebie obrazków.

0

JPanel ma metodę setBorder do sutawiania ramki. Poza tym można to zrobić z pojedynczym panelem. Listener ci nie działał bo źle go dodawałeś.

0

Listener działa, bo jak używam w warunku System.exit(0); to zamyka aplikację, tylko nie wczytuje panelu. Pokombinuje z setBorder, a jeśli i to nie pomoże, to przez ten miesiąc jakoś do tego dojdę, bo na pewno nie zostawię nie rozwiązanego problemu.

0

Wiem dokładnie jaki jest problem. W takim razie pozostało mi się zapytać w jaki sposób wywołać metodę innej klasy bez dodania JPanelu:

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class MenuFrame extends JFrame {
JPanel panelglowny = new JPanel();
	public MenuFrame() 
        {
            
		super("Funkcja kwadratowa");
                add(panelglowny);
                panelglowny.setBackground(Color.YELLOW);
		JPanel obrazPanel = new Menu();
		panelglowny.add(obrazPanel);
                this.addMouseListener(new java.awt.event.MouseAdapter() 
       {
        public void mouseClicked(java.awt.event.MouseEvent evt) 
        {
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>570 && evt.getY()<613)
            {
                                     System.exit(0);

            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>480 && evt.getY()<520)
            {
                         Autorzy autorzy = new Autorzy();
                                     autorzy.autorzy();
                                     panelglowny.removeAll();
                                     panelglowny.add(autorzy);
                                     panelglowny.revalidate();
                                     panelglowny.repaint();            

            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>380 && evt.getY()<422)
            {
                          System.exit(0);          

            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>285 && evt.getY()<323)
            {
                          System.exit(0);          

            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>185 && evt.getY()<223)
            {
                          JPanel moj_profil = new Moj_Profil();
                                     
                                     panelglowny.removeAll();
                                     panelglowny.add(moj_profil);
                                     panelglowny.revalidate();
                                     panelglowny.repaint();          

            }
        }
        
       });
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setResizable(false);
		pack();
		setVisible(true);
	}

        
}

Dokładnie chodzi mi o całkowite usunięcie panelglowny i zrobienie tak, żeby:

if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>185 && evt.getY()<223)
            {
                          JPanel moj_profil = new Moj_Profil();
                                     
                                     panelglowny.removeAll();
                                     panelglowny.add(moj_profil);
                                     panelglowny.revalidate();
                                     panelglowny.repaint();          

            }

to można było dodać bez dodawania panelglowny.

0

Nie rozumiem problemu, co jest złego w takim kodzie?

import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class MenuFrame extends JFrame {
        public MenuFrame() 
        {
 
                super("Funkcja kwadratowa");
                setBackground(Color.YELLOW);
                JPanel obrazPanel = new Menu();
                add(obrazPanel);
                this.addMouseListener(new java.awt.event.MouseAdapter() 
       {
        public void mouseClicked(java.awt.event.MouseEvent evt) 
        {
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>570 && evt.getY()<613)
            {
                                     System.exit(0);
 
            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>480 && evt.getY()<520)
            {
                         Autorzy autorzy = new Autorzy();
                                     autorzy.autorzy();
                                     removeAll();
                                     add(autorzy);
                                     revalidate();
                                     repaint();            
 
            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>380 && evt.getY()<422)
            {
                          System.exit(0);          
 
            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>285 && evt.getY()<323)
            {
                          System.exit(0);          
 
            }
           if(evt.getX( )>674 && evt.getX()<784 && evt.getY( )>185 && evt.getY()<223)
            {
                          JPanel moj_profil = new Moj_Profil();
 
                                     removeAll();
                                     add(moj_profil);
                                     revalidate();
                                     repaint();          
 
            }
        }
 
       });
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setResizable(false);
                pack();
                setVisible(true);
        }
 
}
0

Ogólnie w kodzie nie ma błędu, ale przy wczytywaniu metody Main() robi się taka nieładna ramka:

http://tinypic.com/r/2ecgc5u/5

Powstaje ona dzięki panelglowny, dlatego pokolorowałem ją na żółto, żeby lepiej widzieć.

Dlatego chciałbym, żeby przez klasę MenuFrame można było otworzyć metodę Main() bez konieczności tworzenia panelglowny'ego, dzięki czemu zniknie ta żółta ramka i obraz z metody Main() zapełni całą ramkę. Tym bardziej, że klasa Main posiada wbudowany JPanel i powinien dodać się do ramki bez konieczności dodawania dodatkowego panelu w klasie MenuFrame.

0

Ty patrzyłeś na mój kod? Tam nie ma żadnego panelu o nazwie panelglowny.

0

No właśnie problemem jest, że gdy usuniemy panelglowny zdarzenia myszy działają, ale tylko tam gdzie jest if(...){System.ext(0);} Kiedy mam wczytać metode Main(), która znajduje się w klasie Main extends JPanel nic się nie dzieje, nawet błędu nie zwraca, nawet nie usuwa tego co znajduje się w chwili obecnej w ramce.

0

Sprawdź czyzdarzenie dociera i jakie ma parametry.

        public void mouseClicked(java.awt.event.MouseEvent evt) 
        {
             System.out.println("x="+evt.getX()+" y="+evt.getY());
0

Zdarzenie dociera:

x=722 y=206

Wartości mieszczą się w wytyczonym przedziale.

0

To teraz wybierz się do ifa gdzie jest zmiana panelu i wypróbuj to:

        ....nowyPanel=....
        System.out.println("Będę zmieniał panel");
        removeAll();
        add(nowyPanel);
        validate();
        repaint();  

Zwróć uwagę, że jest validate().

0

Wyskakuje komunikat: "Będę zmieniał panel", czyli to potwierdza otrzymanie zdarzenia. Niestety nic się nie zmienia.

Przyglądam się metodzie, którą mam wywoływać i zastanawiam się, czy to przypadkiem w niej nie ma jakiegoś błędu, który nie pozwala odświeżyć ekranu:

public class Menu extends JPanel {

	private BufferedImage tlomenu;
        

	public Menu() {
		super();
                
		File imageFile = new File("menu.png");
		try {
			tlomenu = ImageIO.read(imageFile);
		} catch (IOException e) {
			System.err.println("Blad odczytu obrazka");
			e.printStackTrace();
		}

		Dimension dimension = new Dimension(tlomenu.getWidth(), tlomenu.getHeight());
                

		
		setPreferredSize(dimension);
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(tlomenu, 0, 0, this);
                
	}
}

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