Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > смена рисунка на форме по нажатию кнопки


Автор: Pawl 13.11.2013, 23:18
Собственно, возникла такая проблема. С GUI практически не работал, а тут вот попалось... Уже предельно упростил задачу, не знаю, как сделать: На форме отображается рисунок, надо, чтобы при нажатии кнопки этот рисунок поменялся. Вот мой код (не рабочий, но желательно, чтобы рабочий был максимально близок к этому):
Код

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {
    private JButton b;
    private JPanel p = paintImg("f1.bmp");

// вот тут я для смены рисунка вешаю событие на кнопку
    protected void addButtonAction(String buttonName) {
        b = new JButton(buttonName);
        b.addActionListener(new ActionListener() {            
            public void actionPerformed(ActionEvent ev) {
                p = paintImg("f2.bmp");
                repaint();
            }
        });        
    }

    protected JPanel paintImg(final String ImgName) {
        return new JPanel() {
            public void paintComponent(Graphics g) {
                Image image = null;
                try {
                    image = ImageIO.read(new File(ImgName));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (image != null) {
                    g.drawImage(image, 0, 0, 450, 50, null);
                }
            }
        };
    }

    public MainFrame() {
        setSize(500, 200);
        addButtonAction("GO!");
        Box contentBox = Box.createVerticalBox();
        contentBox.add(b);
        contentBox.add(p);
        getContentPane().add(contentBox);        
    }

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Спасибо заранее за помощь!

Автор: Michael.de 14.11.2013, 13:30
Pawl: возможно нижеперечисленное может пригодиться

1. Общая информация: _http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html
2. пример: _http://docs.oracle.com/javase/tutorialJWS/samples/uiswing/IconDemoProject/IconDemo.jnlp
3. и его java source code + *.jpg: _http://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#IconDemo

Автор: Michael.de 18.11.2013, 17:38
Если ещё актуально... вот рабочий пример:
Код

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MainFrame extends JFrame implements ActionListener {
    private JButton b1, b2;
    private JPanel p;
    private JLabel l;

    public MainFrame() {
        setSize(500, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        p=new JPanel();
        b1=new JButton("first");
        b2=new JButton("second");
        b1.addActionListener(this);
        b2.addActionListener(this);
        l=new JLabel();
        paintImg(l, "f1.bmp");
        p.add(b1);
        p.add(b2);
        p.add(l);
        getContentPane().add(p);
        setVisible(true);
    }

    private JLabel paintImg(JLabel l, String ImgName) {
    Image image = null;
    try {
        image = ImageIO.read(new File(ImgName));
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (image != null) {
        l.setIcon(new ImageIcon(image));
    }
    return l;
    }

    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if (o == b1) {
            paintImg(l, "f2.bmp");
        }
        else if (o == b2) {
            paintImg(l, "f1.bmp");
        }
        else ; // etc.
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(
            new Runnable() {
                public void run() {
                    new MainFrame();
                }
            }
        );
    }
}


P.S. ... и repaint() с paintComponent() не требуется smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)