- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用以下代码在 Java Swing 中显示错误对话框:
JOptionPane.showMessageDialog(null, "Arquivo de imagem não encontrado. Por gentileza, altere o caminho do arquivo.", "Erro", JOptionPane.ERROR_MESSAGE);
使用 Windows 10 默认外观:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
但是图标看起来被裁剪了,像这样:
关于如何解决这个问题有什么想法吗?
这是 SSCCE:
import javax.swing.JOptionPane;
import javax.swing.UIManager;
public class SSCCE {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
JOptionPane.showMessageDialog(null, "Error message", "Error", JOptionPane.ERROR_MESSAGE);
} catch (Exception e){
e.printStackTrace();
}
}
}
最佳答案
看起来 Oracle 终于注意到了这一点 will fix it in JDK 9 ,但对于那些不愿意提供自定义图标的人来说,目前这里有一个 qiuck、hacky 和 Windows 相关的解决方案。
在调用 UIManager.setLookAndFeel()
之后插入此代码:
try
{
String[][] icons =
{
{"OptionPane.errorIcon", "65581"},
{"OptionPane.warningIcon", "65577"},
{"OptionPane.questionIcon", "65579"},
{"OptionPane.informationIcon", "65583"}
};
//obtain a method for creating proper icons
Method getIconBits = Class.forName("sun.awt.shell.Win32ShellFolder2").getDeclaredMethod("getIconBits", new Class[]{long.class, int.class});
getIconBits.setAccessible(true);
//calculate scaling factor
double dpiScalingFactor = Toolkit.getDefaultToolkit().getScreenResolution() / 96.0;
int icon32Size = (dpiScalingFactor == 1)?(32):((dpiScalingFactor == 1.25)?(40):((dpiScalingFactor == 1.5)?(45):((int) (32 * dpiScalingFactor))));
Object[] arguments = {null, icon32Size};
for (String[] s:icons)
{
if (UIManager.get(s[0]) instanceof ImageIcon)
{
arguments[0] = Long.valueOf(s[1]);
//this method is static, so the first argument can be null
int[] iconBits = (int[]) getIconBits.invoke(null, arguments);
if (iconBits != null)
{
//create an image from the obtained array
BufferedImage img = new BufferedImage(icon32Size, icon32Size, BufferedImage.TYPE_INT_ARGB);
img.setRGB(0, 0, icon32Size, icon32Size, iconBits, 0, icon32Size);
ImageIcon newIcon = new ImageIcon(img);
//override previous icon with the new one
UIManager.put(s[0], newIcon);
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
在 Windows 上,提供给应用程序的图标已按当前 DPI 设置缩放(96 = 无缩放,120 = +25%,144 = +50%)。不幸的是,Java 总是假定图标的大小为 16x16 或 32x32,但事实并非如此。上面的代码利用 Java 使用的本地方法 sun.awt.shell.Win32ShellFolder2.getIconBits()
来获取操作系统图标,但提供了适当的大小。这种方法将来可能无法使用,因为 Win32ShellFolder2
不是 API 的一部分,可能会被修改或完全删除,但到目前为止,这是保留 native 图标的唯一方法。
关于java - JOptionPane 图标在 Windows 10 中被裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926645/
我正在使用 JOptionPane 来获取字符串。单击“确定”即可保存字符串。现在我希望弹出第二个 JOptionPane 以输入第二个必要的字符串。是否有机会将 ActionListener 添加到
我有一个显示来自 JOptionPane 的确认消息的过程。此过程从 JMenuItem 的 Actionlistener 内的 SwingUtilities.invokeLater(runnable
我使用以下代码来获取InputDialog: String c = JOptionPane.showInputDialog("Select number",JOptionPane.OK_OPTION)
正如你从我上面的主题中看到的, 我想知道我怎么能解雇一个 JOptionPane 因为另一个 JOptionPane 而变得无关紧要,因为用户出于某种原因没有通过自己点击确定按钮(例如)解雇第一个。
没有收到“文件已成功接收”消息,请帮助我。将文件从客户端传输到服务器时,即使文件已收到,也不会显示该消息。 这是使用套接字将文件从客户端传输到服务器的程序,接口(interface)也是使用java
JOptionPane.showInputDialog 有一个不需要父组件参数的表单。 JOptionPane.showConfirmDialog 确实如此。这是为什么? 最佳答案 JOptionPa
我正在用 Java 创建一个基于 Tic Tac Toe GUI 的游戏,并且正在努力将 2D 数组与 JOptionPane 结合使用。到目前为止,我已经能够创建可供选择的按钮: import ja
使用 JOprionPane 时,光标出现了一些问题。我将光标设置到 pharent 框架,然后使用这个显示一个对话框: Object[] possibilities = {"ham", "spam"
我创建了一个打开 JOptionPane 的按钮。它允许用户输入 string..>> String str = JOptionPane.showInputDialog 如何获取用户输入到 jopti
该代码正在运行。但问题是,当选择 NO_OPTION 时,窗口就会被释放。我想在选择 NO_OPTION 时保留窗口?你能给点建议吗? int dialogButton = JOptionPa
我正在 Java 上开发 Tic Tac Toe 游戏(eclipse)。在我的计算机上,我的对话框非常小。我一直在努力把它做得更大。我没有任何运气。我希望这里有人能引导我走向正确的方向。下面的代码是
我正在使用脚本 API 为我玩的游戏的机器人制作脚本,但是每当我覆盖机器人管理器时,就会出现一个 JOptionPane 来阻止执行,直到我关闭它,但是我想在不运行该脚本的情况下运行此脚本人为干预,所
我正在用 Java 开发一个游戏,我试图在 JOptionPane 确认框打开时暂停它。这是代码: window.addWindowListener(new WindowAdapter() {
这个问题已经有答案了: Calling one JFrame from another using Timer without any buttons (1 个回答) 已关闭 9 年前。 需要帮助制作
很抱歉代码这么长,我只需要知道我缺少什么来初始化我的所有决定。编译器提示我的变量没有被初始化。谢谢你。 import javax.swing.JOptionPane; public class Sem
我想使用 JOptionPane 处理一些异常。这是主要方法: public class MainRun { public static void main(String args[]){
不允许使用数组,该函数正在工作,但只是返回 0,就好像它没有计算正确的输入字符一样,但现在它给了我一个“字符串超出范围:3” 这应该运行,打开一个窗口,要求我输入一个字符串,在本例中是一个单词,然后打
我正在使用 Jfilechooser,如果我选择文件,它将计算文件名的字符数,但是如果文件超过 3kb,它将限制 Joptionpane 将显示。我的问题是即使文件是0kb,Joptionpane也会
我创建了一个应用于框架的名为 addSupplier 的按钮,然后创建了一个操作监听器,因此一旦按下 addSupplier 按钮,它将创建一个 JOptionPane,其中有一个附加了 JTextF
我知道解决方案是使用 for 循环来逐步遍历数组并显示在 Pane 中。但是我没有找到对此的直接解释。我需要一个下一个和一个上一个按钮来显示每个数组元素,并且在按下下一个按钮时到达第一个元素后仅返回到
我是一名优秀的程序员,十分优秀!