2 回答
TA贡献1824条经验 获得超6个赞
UIManager.put("OptionPane.okButtonText", "Text I want");
上面的代码将更改您创建的所有 JOptionPanes 上所有“确定”按钮的文本。
如果您想要更改特定 JOptionPane 上单个按钮上的文本。
有没有办法访问 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() );
}
TA贡献1856条经验 获得超11个赞
如果你想在所有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()
如果您想要效果鼠标悬停在按钮上,我正在研究这个库并提供了鼠标悬停的解决方案。
如果您可以使用此常量对库内的 DefaultButton 进行个性化设置
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:这仅是您需要在项目中添加鼠标悬停时的信息
添加回答
举报