2010-05-31 111 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(...));