2010-05-31 107 views
1

我有一个简单的应用程序,显示由平铺图像(名为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); 
    } 
} 

这应该像这样工作: this http://img535.imageshack.us/img535/3129/lab8a.jpg

回答

0

你需要有构造函数添加事件侦听器。

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

尝试注册的按钮来听这样的事件:

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

+1,因为是第一次提到添加ActionListener(我假设这是在我发布我的答案时完成的)。 – camickr 2010-05-31 03:40:16

0

而是重新分配bJButton一个新实例,你应该简单地重新设置图标:

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

(看看路过参考/在Java的价值观念传递,well explained here

上最重要的是,你需要按照文森特的意见,并与所有按钮的实际登记为ActionListener

l.addActionListener(this); 
0
b = new JButton(new ImageIcon("u"+i+".jpg")); 

创建一个新按钮并没有做任何事,因为它没有被添加到GUI中,所以按钮只在内存中存在。

简单的解决方法就是重新设置图标:

b.setIcon(new ImageIcon(...));