2012-04-05 21 views
5

Tôi đang đọc một cuốn sách tuyệt vời có tên Swing: Hướng dẫn cho người mới bắt đầu. Có mã này trong cuốn sách mà tạo ra một nút và một nhãn cảnh báo trên các sự kiện thay đổi trạng thái nút của:Phương thức Java isRollover() không tạo ra sự kiện trong ứng dụng xoay của tôi

//Demonstrate a change listener and the button model 

package swingexample2_6; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class ChangeDemo { 

    JButton jbtn; 
    JLabel jlab; 

    public ChangeDemo() { 
     //Create a new JFrame container 
     JFrame jfrm = new JFrame("Button Change Events"); 

     //Specify FlowLayout for the layout manager 
     jfrm.getContentPane().setLayout(new FlowLayout()); 

     //Give the frame an initial size 
     jfrm.setSize(250, 160); 

     //Terminate the program when the user closes the application 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create an empty label 
     jlab = new JLabel(); 

     //Make a button 
     jbtn = new JButton("Press for Change Event Test"); 

     //--Add change listener 
     jbtn.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent ce) { 
       ButtonModel mod = jbtn.getModel(); 
       String what = ""; 

       if (mod.isEnabled()) { 
        what += "Enabled<br>"; 
       } 
       if (mod.isRollover()) { 
        what += "Rollover<br>"; 
       } 
       if (mod.isArmed()) { 
        what += "Armed<br>"; 
       } 
       if (mod.isPressed()) { 
        what += "Pressed<br>"; 
       } 

       //Notice that this label's text is HTML 
       jlab.setText("<html>Current stats:<br>" + what); 
      } 
     }); 


     //Add the components to the content pane 
     jfrm.getContentPane().add(jbtn); 
     jfrm.getContentPane().add(jlab); 

     //Display the frame 
     jfrm.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Create the frame on the event dispatching thread 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ChangeDemo(); 
      } 
     }); 
    } 
} 

Tất cả mọi thứ đang làm việc tốt, ngoại trừ cho sự kiện rollover. Hệ điều hành cơ bản là Mac OS Lion. Tôi có nên đổ lỗi cho Lion vì vấn đề này hay tôi đang làm gì sai? Cảm ơn bạn.

Cập nhật 1: My picture neatbeans cài đặt (Tôi hy vọng nó giúp) settings http://i44.tinypic.com/vdzg92.png

+2

hoạt động tốt cho tôi ... Windows 7 OS – mre

+2

@mre Tương tự ở đây (cũng sử dụng Win. 7 với phiên bản 1.6 JRE). Phiên bản JRE được sử dụng là gì? (Câu hỏi cho cả hai mre & poster gốc.) –

+1

jdk được sử dụng là 1.6.0 – skiabox

Trả lời

5

Mã như thử nghiệm trên Leopard với phiên bản Java 1.6.0_26 hiển thị dưới đây. Thẻ theo dõi </html> đã khắc phục sự cố làm nổi bật khi di chuột qua.

Hợp đồng bổ sung: Sử dụng ví dụ được cập nhật bên dưới, thêm setRolloverEnabled(true) cho phép mô hình hoạt động như mong đợi. Thật thú vị, đại diện giao diện người dùng Mac, com.apple.laf.AquaButtonUI, không làm gì khi isRollover()true. Nếu điều quan trọng để ứng dụng của bạn là, bạn có thể có những hành động mong muốn khi vị sau đây là true:

System.getProperty("os.name").startsWith("Mac OS X") 

Để tham khảo, example này chứng tỏ setRolloverIcon().

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class ChangeDemo { 

    private JButton jbtn; 
    private JLabel jlab; 

    public ChangeDemo() { 
     JFrame jfrm = new JFrame("Button Change Events"); 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jfrm.setLayout(new GridLayout(0, 1)); 
     jlab = new JLabel("", JLabel.CENTER); 
     jbtn = new JButton("Press for Change Event Test"); 
     jbtn.setRolloverEnabled(true); 

     jbtn.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent ce) { 
       ButtonModel mod = jbtn.getModel(); 
       String what = ""; 

       if (mod.isEnabled()) { 
        what += "Enabled<br>"; 
       } 
       if (mod.isRollover()) { 
        what += "Rollover<br>"; 
       } 
       if (mod.isArmed()) { 
        what += "Armed<br>"; 
       } 
       if (mod.isPressed()) { 
        what += "Pressed<br>"; 
       } 

       //Notice that this label's text is HTML 
       jlab.setText("<html>Current stats:<br>" + what + "</html>"); 
      } 
     }); 

     JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createEmptyBorder(50, 10, 0, 10)); 
     panel.add(jbtn); 
     jfrm.add(panel); 
     jfrm.add(jlab); 

     jfrm.pack(); 
     jfrm.setLocationRelativeTo(null); 
     jfrm.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Create the frame on the event dispatching thread 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ChangeDemo changeDemo = new ChangeDemo(); 
      } 
     }); 
    } 
} 
+0

Điều đó càng trở nên thú vị hơn theo thời gian. – skiabox

+0

Tôi vẫn không nhận được sự kiện hiệu ứng rollover với thẻ html đóng! – skiabox

+0

+1, hoạt động tốt trên Windows 7 với 1.7.0_03 :-) –

0

OK. Tôi biết điều này đã được trả lời thực sự tốt rồi, và câu hỏi của OP là trên máy Mac, nhưng câu trả lời này cần sharin '.

Nếu bạn đang sử dụng Windows 7, hiệu ứng di chuột qua sẽ không hoạt động nếu bạn đã đặt chủ đề thành "Cổ điển". Đặt nó thành "Cơ bản" và tính năng di chuột qua sẽ hoạt động.

Các vấn đề liên quan