Kolor tła

0

Niedawno zacząłem swoją przygodę z javą, poznałem własnie obsługę zdarzeń i chciałem zrobić dla testu 3 przyciski:

  1. zmiana koloru tła
  2. zmiana koloru przycisku
  3. zmiana tekstu przycisku

Wszystko działa bez problemu z wyjątkiem punktu pierwszego [GreenButton], a najgorsze jest to, że nie dostaje żadnego errora.
Ogólnie cały program jest z poprzedniej zabawy z obrazami.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.io.*;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.imageio.ImageIO;

public class ObrazekPanel extends JPanel {

	private BufferedImage discImage, netImage;
	private int panelHeight;
	private JButton tlo, przycisk, nazwa;
	private JPanel obrazekPanel;

	public ObrazekPanel() {
		super();

		obrazekPanel = this;

		try {
			File imageFile = new File("mu.png");

			discImage = ImageIO.read(imageFile);

			URL imageURL = new URL(
					"http://www.newspl.pl/wp-content/uploads/2010/05/Real-Madryt.jpg");

			netImage = ImageIO.read(imageURL);


		} catch (IOException e) {
			System.err.println("Błąd wczytania obrazka!");
			e.printStackTrace();
		}

		panelHeight = netImage.getHeight();

		Dimension dimension = new Dimension(
				(netImage.getWidth() + discImage.getWidth()), panelHeight);
		setPreferredSize(dimension);
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(discImage, 0, 0, this);
		g2d.drawImage(netImage, discImage.getWidth(), 0, this);
		setLayout(null);

		tlo = new GreenButton();
		przycisk = new ColorButton();
		nazwa = new TitleButton();

		add(tlo);
		add(przycisk);
		add(nazwa);

		tlo.setBounds(20, 300, 70, 30);
		przycisk.setBounds(100, 300, 70, 30);
		nazwa.setBounds(180, 300, 70, 30);
	}

	class GreenButton extends JButton implements ActionListener {

		GreenButton() {
			super("Green");
			addActionListener(this);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			obrazekPanel.setBackground(Color.GREEN);
		}
	}

	class ColorButton extends JButton implements ActionListener {

		ColorButton() {
			super("Button");
			addActionListener(this);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			setBackground(Color.MAGENTA);
		}
	}

	class TitleButton extends JButton implements ActionListener {

		TitleButton() {
			super("Title");
			addActionListener(this);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			setText("Done");
		}
	}
}

 

Nic mi już nie przychodzi do głowy... Wydaje mi się, że wszystko powinno być ok. Jak naciskam przycisk do zmiany tła to widoczna jest lekka zmiana cienia na jednym z obrazków.

Dla uzupełnienia dodam jeszcze źródło ramki i klasy testową

 
import javax.swing.*;

public class ObrazekFrame extends JFrame {

	public ObrazekFrame() {
		super("Program obrazkowy ver. 0.1");

		JPanel obrazekPanel = new ObrazekPanel();
		add(obrazekPanel);

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

import java.awt.EventQueue;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				new ObrazekFrame();
			}
		});
	}

}

 
1

standardowo zapomniałeś o metodach revalidate albo repaint :)

0

Ok, tylko teraz mam problem z umiejscowieniem tego... Początkowo wstawiłem po prostu tak:

@Override
		public void actionPerformed(ActionEvent e) {
			obrazekPanel.setBackground(Color.GREEN);
			repaint();
 

ale nie przyniosło to żadnej zmiany, dlatego dodałem obrazekPanel.repaint(); i niestety nadal jest jak było ;/

Poszperałem troche w google, ale żadnych konkretów nie znalazłem, poprzeglądałem przykłady różne, tyle że nie mogłem znaleźć sytuacji zbliżonej do mojej ;/

0

nie podpiąłeś nigdzie panelu obrazekPanel to się nie dziwię że ci nie zmienia koloru :)

0

Nie ma to jak profesjonalna pomoc...
A w jaki sposób podpiąć owy panel?
Bo cały czas myślałem, że linijka obrazekPanel = this; jest za to odpowiedzialna, ale widocznie źle zrozumiałem tutek.

ps. tym razem prosze o jakąs konkretną odpowiedź

0

Ale co chcesz zobaczyć? Przecież żadnego tła nie widać, bo zasłoniłeś cały panel obrazkami.
Btw, program działa źle gdy obrazki są niedostępne.

0

Pod pierwszym obrazkiem jest wolne miejsce [tam gdzie są przyciski], a dodatkowo jest w png takze zmianialby swoje tlo.

Ogolnie to program ten pisze tylko w celach edukacyjnych ;p

1

Czy jest wolne miejsce, to zależy od rozmiaru obrazka. Ja miałem inny plik mu.png.
Brakowało Ci jednej kluczowej instrukcji, przeniosłem też fragment kodu, który powinien być wykonany raz, z metody paintComponent() do konstruktora.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.io.*;
 
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.imageio.ImageIO;
 
public class ObrazekPanel extends JPanel {
 
        private BufferedImage discImage, netImage;
        private int panelHeight;
        private JButton tlo, przycisk, nazwa;
        private JPanel obrazekPanel;
 
        public ObrazekPanel() {
                super();
                setLayout(null);
                obrazekPanel = this;
 
                try {
                        File imageFile = new File("mu.png");
 
                        discImage = ImageIO.read(imageFile);
 
                        URL imageURL = new URL(
                                        "http://www.newspl.pl/wp-content/uploads/2010/05/Real-Madryt.jpg");
 
                        netImage = ImageIO.read(imageURL);
 
 
                } catch (IOException e) {
                        System.err.println("Błąd wczytania obrazka!");
                        e.printStackTrace();
                }
 
                panelHeight = netImage.getHeight();
 
                Dimension dimension = new Dimension(
                                (netImage.getWidth() + discImage.getWidth()), panelHeight);
                setPreferredSize(dimension);
  
                
                tlo = new GreenButton();
                przycisk = new ColorButton();
                nazwa = new TitleButton();
 
                add(tlo);
                add(przycisk);
                add(nazwa);
 
                tlo.setBounds(20, 300, 70, 30);
                przycisk.setBounds(100, 300, 70, 30);
                nazwa.setBounds(180, 300, 70, 30);                
        }
 
        @Override
        public void paintComponent(Graphics g) {
        	    super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.drawImage(discImage, 0, 0, this);
                g2d.drawImage(netImage, discImage.getWidth(), 0, this);

        }
 
        class GreenButton extends JButton implements ActionListener {
                
                GreenButton() {
                	    
                        super("Green");
                   
                        addActionListener(this);
                }
 
                @Override
                public void actionPerformed(ActionEvent e) {
                        obrazekPanel.setBackground(Color.GREEN);
                        obrazekPanel.repaint();
                }
        }
 
        class ColorButton extends JButton implements ActionListener {
 
                ColorButton() {
                        super("Button");
                        addActionListener(this);
                }
 
                @Override
                public void actionPerformed(ActionEvent e) {
                        setBackground(Color.MAGENTA);
                }
        }
 
        class TitleButton extends JButton implements ActionListener {
 
                TitleButton() {
                        super("Title");
                        addActionListener(this);
                }
 
                @Override
                public void actionPerformed(ActionEvent e) {
                        setText("Done");
                }
        }
}
0

Dzięki wielkie, wszystko juz gra... Czyli to co jest w paintComponent wykonuje się za każdym razem przy jakiejś akcji tak?

1

Za każdym razem gdy trzeba odmalować (okno zostało odsłonięte, zmieniło rozmiar, wywołana została metoda repaint(),...). Oryginalna metoda paintComponent() rysuje panel w kolorze tła. Ty ja nadpisałeś (tzn. zamieniłeś) metodą

        public void paintComponent(Graphics g) {
                Graphics2D g2d = (Graphics2D) g;
                g2d.drawImage(discImage, 0, 0, this);
                g2d.drawImage(netImage, discImage.getWidth(), 0, this);

        }

w której było tylko rysowanie obrazków, ja dodałem wiersz

super.paintComponent(g);

który jest wywołaniem oryginalnej metody (tzn. rysowaniem tła).

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