2015-06-01 13 views
9

Tôi có một tình huống mà tôi cần để hiển thị một JOptionPane sau khi nhấp vào một JButton. JButton có biểu tượng mặc định và biểu tượng cuộn qua (hiển thị khi nào, tốt, con trỏ cuộn qua nút). Tuy nhiên, một khi nút được nhấp và một JOptionPane xuất hiện, biểu tượng rollover không thay đổi về bản gốc, và tiếp tục duy trì như vậy cho đến khi người dùng đưa chuột trở lại khung của JButton sau khi chọn một lựa chọn JOptionPane thích hợp. Làm thế nào tôi sẽ "un-rollover" các JButton khi nó được nhấp và JOptionPane được hiển thị?"Un-rollover" một JButton khi một JOptionPane được hiển thị

TL; DR: JButton hiển thị biểu tượng cuộn qua ngay cả khi được nhấp và JOptionPanel được hiển thị. Tôi không thích.

Đây là SSCCE:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 


public class ButtonUnrollover { 

    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    final JPanel p = new JPanel(); 
    JButton b = new JButton(); 
    b.setIcon(UIManager.getIcon("OptionPane.informationIcon")); 
    b.setRolloverIcon(UIManager.getIcon("OptionPane.errorIcon")); 
// b.setSelectedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
// b.setRolloverSelectedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
// b.setPressedIcon(UIManager.getIcon("OptionPane.informationIcon")); 
    p.add(b); 
    b.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     JOptionPane jOP = new JOptionPane("Dummy message"); 
     JDialog dialog = jOP.createDialog(p, null); 
     dialog.setVisible(true); 
     } 
    }); 

    f.add(p); 
    f.pack(); 
    f.setVisible(true); 
    } 

} 

NB: Tôi đã tìm thấy một số tương tự câu hỏi để thế này. Tuy nhiên, câu hỏi này không phải là một bản sao bởi vì những câu hỏi liên quan đến một vấn đề hơi khác với vấn đề này (chẳng hạn như nút bấm được nhấn, không được cuộn qua). Một vài trong số những câu hỏi này (tốt, thực sự tất cả chúng tôi có thể tìm) là:

Trả lời

5

Trạng thái cuộn lại được quản lý bởi ButtonModel. Bạn có thể đặt lại cờ rollover thông qua phương thức setRollover(boolean b) của mô hình, điều này sẽ đặt Biểu tượng trở lại Biểu tượng trạng thái không di chuột qua. Thực hiện trong ví dụ của bạn ActionListener:

b.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    b.getModel().setRollover(false);//reset the rollover flag 
    JOptionPane jOP = new JOptionPane("Dummy message"); 
    JDialog dialog = jOP.createDialog(p, null); 
    dialog.setVisible(true); 
    } 
}); 

Bạn cũng có thể muốn kiểm tra xem chuột vẫn còn nằm trong vòng JButton sau khi hộp thoại được đóng cửa để thiết lập lại cờ rollover (nếu cần thiết) - bạn có thể làm như vậy qua MouseInfo, kiểm tra xem JButton có chứa điểm hay không bằng cách chuyển đổi tọa độ màn hình được lấy từ MouseInfo.getPointerInfo().getLocation() thành tọa độ thành phần sử dụng SwingUtilities.convertPointFromScreen.

+0

+1: Cảm ơn bạn rất nhiều! Điều này làm nó rất độc đáo. Tôi đã tìm kiếm hàm setRollover() trên chính JButton thay vì trên ButtonModel. –

1

Nếu bạn có thể sống với hộp thoại của bạn không phải là phương thức , thêm

dialog.setModal(false); 

vào khối người nghe hành động của bạn.

+0

+1: Đó là giải pháp khá gọn gàng. Nhưng tất nhiên, tôi thích có quyền kiểm soát tuyệt đối bằng cách * buộc * một người dùng đưa ra quyết định sau đó và ở đó ... Mwahahahahaha ... –

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