![](/img/trans.png)
[英]how to place mouse directly above a JOptionPane button in java?
[英]How to add mouse listener to JOptionPane button?
我想更改JOptionPane.ShowMessageDialog上Button的外觀。 我設法用更改了按鈕標題
UIManager.put("OptionPane.okButtonText", "Text I want");
現在,我的下一個目標是使Button與我的其余應用程序中的按鈕相同。 也就是說,將鼠標懸停在其上時,它將更改背景和字體顏色。 在其余的按鈕上,我添加了像這樣的鼠標監聽器:
//setting change color on hover
private final MouseListener mouseAction = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(163, 184, 204));
rollOver.setForeground(Color.WHITE);
rollOver.setFont(b);
}
};
@Override
public void mouseExited(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(230, 230, 230));
rollOver.setForeground(Color.BLACK);
rollOver.setFont(f);
}
};
};
以前在代碼中我設置了Font varibles:
Font f = new Font("System", Font.PLAIN, 12);
Font b = new Font("System", Font.BOLD, 12);
我可以從頭開始進行新的對話,並阻止這種行為,但這太過分了。
有什么方法可以訪問JOptionPane上的Button並為其添加鼠標偵聽器?
如果您想在所有OptionPanel中看到相同的效果,我認為重寫BasicOptionPaneUI是一個很好的解決方案
這是一個最小的例子
public class MyOptionPaneUI extends BasicOptionPaneUI {
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"})
public static ComponentUI createUI(JComponent c) {
return new MyOptionPaneUI();
}
private static final MyMouseListener m = new MyMouseListener();
@Override
public void update(Graphics g, JComponent c) {
super.update(g, c);
}
@Override
protected void installListeners() {
JButton button = (JButton) getButtons()[0];
button.addMouseListener(m);
super.installListeners();
}
@Override
protected void uninstallListeners() {
JButton button = (JButton) getButtons()[0];
button.removeMouseListener(m);
super.uninstallListeners();
}
public static class MyMouseListener extends MouseAdapter{
@Override
public void mouseEntered(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(163, 184, 204));
rollOver.setForeground(Color.WHITE);
}
};
@Override
public void mouseExited(MouseEvent e) {
JButton rollOver = (JButton)e.getSource();
if (rollOver.isEnabled()) {
rollOver.setBackground(new Color(230, 230, 230));
rollOver.setForeground(Color.BLACK);
}
};
}
}
在您的主類中,您可以添加此代碼以將類加載到UIDefoult中
static{
UIManager.put("OptionPaneUI", MyOptionPaneUI.getClass().getCanonicalName());
}
因為getButtons()[0]
,因為我在BasicOptionPaneUI
里面看到了這段代碼
else if (type == JOptionPane.OK_CANCEL_OPTION) {
defaultOptions = new ButtonFactory[2];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"), minimumWidth);
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.cancelButtonText",l),
getMnemonic("OptionPane.cancelButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.cancelIcon"), minimumWidth);
} else {
defaultOptions = new ButtonFactory[1];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"), minimumWidth);
}
在方法protected Object[] getButtons()
如果您想將效果鼠標懸停在按鈕上,我正在使用此庫,並提供了鼠標懸停的解決方案。
如果您可以使用此常量個性化庫中的DefaoultButton
UIManager.put("Button[Default].background", new Color(163, 184, 204));
UIManager.put("Button[Default].foreground", Color.WHITE);
UIManager.put("Button[Default].mouseHoverColor", new Color(230, 230, 230));
ps:僅當您需要在項目中添加鼠標懸停時才提供此信息
UIManager.put("OptionPane.okButtonText", "Text I want");
上面的代碼將更改您創建的所有JOptionPanes上所有“確定”按鈕的文本。
如果要更改特定JOptionPane上單個按鈕上的文本,請閱讀Swing教程中有關“ 自定義按鈕文本”的部分 。
有什么方法可以訪問JOptionPane上的Button並為其添加鼠標偵聽器?
當您使用靜態showXXX(...)
方法時,會創建一個模態JDialog,因此您無法訪問對話框或其組件,直到對話框關閉為時已晚。
因此,您需要手動創建JOptionPane
並將其添加到JDialog
。 可以通過閱讀JOptionPane API
並查看標題為"Direct Use"
的部分來找到執行此操作的基礎。
創建JOptionPane
(在使對話框可見之前),您可以在選項窗格中搜索按鈕,並將MouseListener
添加到每個按鈕。 為了幫助您解決此問題,您可以使用Swing Utils類。 它將對選項窗格進行遞歸搜索,並在List
中將按鈕返回給您。 然后,您可以遍歷List
並添加MouseListener
。
使用此幫助程序類的基本代碼為:
JOptionPane optionPane = new JOptionPane(
"Are you sure you want to exit the application",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_CANCEL_OPTION);
List<JButton> buttons = SwingUtils.getDescendantsOfType(JButton.class, optionPane, true);
for (JButton button: buttons)
{
System.out.println( button.getText() );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.