Kolor tła

2011-05-16 12:04
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();
            }
        });
    }

}

Pozostało 580 znaków

2011-05-16 14:46
1

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

Pozostało 580 znaków

2011-05-16 16:29
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 ;/

Pozostało 580 znaków

2011-05-16 17:27
0

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

Pozostało 580 znaków

2011-05-16 23:13
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ź

Pozostało 580 znaków

2011-05-16 23:55
bo
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.

Pozostało 580 znaków

2011-05-17 10:02
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

edytowany 2x, ostatnio: malymakar, 2011-05-17 10:05

Pozostało 580 znaków

2011-05-17 11:05
bo

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");
                }
        }
}

Pozostało 580 znaków

2011-05-17 13:32
0

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

Pozostało 580 znaków

2011-05-17 13:45
bo
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).

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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