Начиная со слушателей событий - PullRequest
1 голос
/ 31 мая 2010

У меня есть простое приложение, показывающее картинку из мозаичных изображений (с именем u1, u2, ..., u16.jpg) Теперь я хотел бы добавить к нему несколько событий, чтобы я мог показывать эти изображения только при нажатии соответствующей кнопки. Я пытался сделать это самостоятельно, но это не работает. Где я что-то не так делаю?

Оригинальный код:

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.BevelBorder;

public class Tiles_2 {

    public static void main(String[] args) {
        final JFrame f = new JFrame("Usmiech");
        JPanel panel = new JPanel(new GridLayout(4, 4, 3, 3));
        JLabel l = new JLabel();

        for (int i = 1; i < 17; i++) {
            String path = "u"+ i+".jpg";
            l = new JLabel(new ImageIcon(path));
            l.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
            panel.add(l);
        }

        f.setContentPane(panel);
        f.setSize(300, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

Новый код:

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.*;

public class Zad_8_1 implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        JButton b = (JButton)(e.getSource());
        String i = b.getText();
        b = new JButton(new ImageIcon("u"+i+".jpg"));
    }

    public static void main(String[] args) {
        final JFrame f = new JFrame("Smile");
        JPanel panel = new JPanel(new GridLayout(4, 4, 3, 3));
        JButton l = null;

        for (int i = 1; i < 17; i++) {
            String path = "u"+ i+".jpg";
            l = new JButton(""+i);
            l.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
            l.setSize(53,53);
            panel.add(l);
        }

        f.setContentPane(panel);
        f.setSize(300, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

Это должно работать так: это http://img535.imageshack.us/img535/3129/lab8a.jpg

Ответы [ 4 ]

1 голос
/ 31 мая 2010

Попробуйте зарегистрировать кнопки для прослушивания события следующим образом:

 for (int i = 1; i < 17; i++) {
        String path = "u"+ i+".jpg";
        l = new JButton(""+i);
        l.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        l.setSize(53,53);
        l.addActionListener(this);
        panel.add(l);
    }
0 голосов
/ 02 июня 2010

Вам нужен конструктор для добавления слушателей событий.

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.*;
import java.awt.*;

public class Demo {

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                render("Window");
            }
        });
    }

    public static void render(String s){
        JFrame f = new JFrame("Smile");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Pane pan = new Pane();
        f.add(pan);
        f.setSize(300,300);
        f.setVisible(true);
    }
}

    class Pane extends JPanel implements ActionListener {

        Pane(){
            setLayout(new GridLayout(4, 4, 3, 3));
            JButton l = null;
            for (int i = 1; i < 17; i++) {
                l = new JButton(""+i);
                l.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
                l.addActionListener(this);
                l.setSize(53,53);
                add(l);
            }
        }

    public void actionPerformed(ActionEvent e) {
        JButton b = (JButton)(e.getSource());
        String i = b.getText();
        b.setIcon(new ImageIcon("u"+i+".jpg"));
    }
    }
0 голосов
/ 31 мая 2010
b = new JButton(new ImageIcon("u"+i+".jpg")); 

Создание новой кнопки ничего не делает, кнопка просто находится в памяти, поскольку она не была добавлена ​​в графический интерфейс.

Простое решение - просто сбросить иконку:

b.setIcon( new ImageIcon(...) );
0 голосов
/ 31 мая 2010

Вместо переназначения b нового экземпляра JButton, вам просто нужно сбросить значок:

b.setIcon(new ImageIcon("u"+i+".jpg"));

(взгляните на концепцию передачи по ссылке / передаче по значению в Java, хорошо объяснено здесь )

Кроме того, вы должны следовать совету Винсента и фактически зарегистрироваться со всеми кнопками как ActionListener

l.addActionListener(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...