- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,它将使用 JLabel 和图标大小为 32x32 的 ImageIcon。
我现在想使用 64x64 图像,加载它并将其大小调整为 32x32(如果 DPI 较低),否则将其用作高 DPI 图像。
调整大小很容易,这个技巧的例子如下:
ImageIcon icon = ...
Image lowRes = icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH);
return new ImageIcon(lowRes);
但是,我无法找到将 ImageIcon 设置为高 DPI 图像的方法。
我尝试过使用 MultiResolutionImage 但没有成功。
编辑:尝试以简单的方式使用 MultiResolutionImage:
private ImageIcon loadIcon(String iconName)
{
ImageIcon icon = new ImageIcon(getClass().getClassLoader()
.getResource("res/icons/toolbar/" + iconName));
BaseMultiResolutionImage baseMultiResolutionImage = new BaseMultiResolutionImage(
icon.getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH),
icon.getImage()
);
return new ImageIcon(baseMultiResolutionImage);
}
堆栈跟踪:
2019-06-11 14:00:45,962 ERROR [AWT-EventQueue-0] Catch.all - Uncaught exception on [AWT-EventQueue-0]: Invalid Image variant
java.lang.IllegalArgumentException: Invalid Image variant
at java.desktop/sun.awt.image.SurfaceManager.getManager(SurfaceManager.java:82)
at java.desktop/sun.java2d.SurfaceData.getSourceSurfaceData(SurfaceData.java:218)
at java.desktop/sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:572)
at java.desktop/sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
at java.desktop/sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1027)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3415)
at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3391)
at java.desktop/javax.swing.ImageIcon.paintIcon(ImageIcon.java:425)
at java.desktop/com.apple.laf.AquaButtonUI.paintIcon(AquaButtonUI.java:395)
at java.desktop/com.apple.laf.AquaButtonUI.paint(AquaButtonUI.java:304)
at java.desktop/javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1083)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:590)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:907)
at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5262)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1643)
at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1618)
at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1556)
at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1060)
at java.desktop/java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at java.desktop/sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
at java.desktop/sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
at java.desktop/java.awt.Container.paint(Container.java:2002)
at java.desktop/java.awt.Window.paint(Window.java:3926)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:876)
at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1884)
最佳答案
这是采用 SVG 图标并为 hidpi 屏幕支持创建多分辨率图像的示例,如之前评论中所引用:
// Create a multi-resolution image with all 0.25 scaling steps up to 3x
final int size = ...; // base size = 16, 24, 32 etc.
// Create all resolution variants that Windows 10 offers by default
// Could probably drop some, e.g. 1.25 = 2.50 / 2 (Swing should handle that...)
final List< Integer > sizes = ImmutableList.of(
(int) ( size * 1.00 ), // Base image
(int) ( size * 1.25 ),
(int) ( size * 1.50 ),
(int) ( size * 1.75 ),
(int) ( size * 2.00 ),
(int) ( size * 2.25 ),
(int) ( size * 2.50 ),
(int) ( size * 2.75 ),
(int) ( size * 3.00 ) );
final byte[] rawSvgBytes = ...; // Read bytes from SVG file
Image[] images = new Image[ sizes.size() ];
for ( int isize = 0; isize < sizes.size(); isize++ )
{
// Create a PNG transcoder
PNGTranscoder t = new PNGTranscoder();
// Set the transcoding hints
t.addTranscodingHint( SVGAbstractTranscoder.KEY_WIDTH, Float.valueOf( sizes.get( isize ) ) );
t.addTranscodingHint( SVGAbstractTranscoder.KEY_HEIGHT, Float.valueOf( sizes.get( isize ) ) );
// Create the transcoder input
TranscoderInput input = new TranscoderInput();
input.setInputStream( new ByteArrayInputStream( rawSvgBytes ) );
// Create the transcoder output
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
TranscoderOutput output = new TranscoderOutput( ostream );
// Transcode the image
t.transcode( input, output );
// Create an image and ensure its size is initialised
Image image = Toolkit.getDefaultToolkit().createImage( ostream.toByteArray() );
while ( image.getWidth( null ) == -1 )
{
// HACK! Wait for the image to be loaded, else icons may not render at the correct
// location as the width and height returned to Swing are -1
}
images[ isize ] = image;
}
return new ImageIcon( new BaseMultiResolutionImage( images ) ); // First image always the base image
关于java - 在 Java Swing 中从原始图像生成 HiDPI ImageIcon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527169/
我想知道是否有办法创建一个 ImageIcon,它是另一个 ImageIcon 的镜像。 在 Google 上搜索,我找到了如何使用许多 AWT 库来实现这一点。 有没有办法用 Swing 做到这一点
我想为 Tanks Game 编写代码,但在现有 ImageIcon 上设置 tank.jpg 时遇到问题,因为我希望这两个图像都可见并向用户显示,就像: JButton block = new JB
我有一个JTable,我可以在其中从数据库获取数据并显示。其中一列是 blob 对象类型,它包含一个图像(如果存在,否则为 null )。我还有一个用于 JTable 的双击事件处理程序,这样当用户仅
这是我的代码: /** * Opens file and gives a warning if non image. */ private void openFile() { final
我有一个 JLabel与 ImageIcon ,我使用 setIcon() JLabel中的函数. ImageIcon然后上来,坐在我的JLabel 的文字左侧.是否有可能拥有 ImageIcon在文
我有一个对象“Team”,其中包含一些分数变量、名称(字符串)和 Logo 。 Logo 的类型为 ImageIcon: public class Team { public String n
当我尝试在 JTable 中显示 ImageIcon 时,仅呈现描述。代码是: private void createTable() { dataModel = new AbstractTab
我编写了非常简单的代码来显示葡萄的图标,但代码仍然没有向我显示任何内容 这是我的代码 import javax.swing.*; import java.awt.*; public class Cod
我有两个问题: 我正在创建一个简单的内存游戏,它保存随机序列并期望玩家输入相同的输入,并且我正在尝试更改 JButton ImageIcon 当使用 setIcon() 单击到更亮版本的 img1 时
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 我试图向这些标签添加一些图像,但
是否有办法将字符串转换为 ImageIcon? 有点像这里的代码:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Createaniconinmem
这是我的代码 import javax.swing.*; public class Option extends JFrame{ ImageIcon img = new ImageIcon("imag
我正在开发一个 Java swing 应用程序,我正在尝试加载国际象棋棋子的图像,一切都工作得很好,直到突然出现错误: Exception in thread "main" java.lang.Sta
这个问题已经有答案了: Displaying an ImageIcon (2 个回答) 已关闭10 年前。 我有四个面板,我想向这些面板添加图像。 当我点击开始按钮时,每个面板需要更改4张图像。 我正
我在java中制作了这样的图像列表: static String[] imageList1 = { "images/bgs/bg.png", "images/bgs/image1.png",
这个问题已经有答案了: Update JLabel repeatedly with results of long running task (2 个回答) 已关闭 8 年前。 您好,我在将图像名称读
我不知道这里发生了什么,因为我在这里画了很多画,但这让我发疯。 m_background 图像只显示了一半。当我调整大小时,它看起来像是那里有一些组件,所以当我将窗口底部向上拉时,显示的图像较少,而当
我想添加一个图标而不是复选框的默认方框。每当我添加图标时,唯一的复选框标签 View 就不会显示图标或默认方框。为什么没有看到图标..我搜索了很多..但没有任何效果对我有用这是代码.. import
我想在按下按钮一次时在标签上设置图标,如果按下两次,它将删除我已经使用了 label.setIcon(null); 但它对我来说效果不佳。 public void actionPerformed(Ac
我已经研究了很多其他问题,其中人们遇到的问题与我在这里遇到的问题类似(大多数解决方案都是通过简单的错误找到的),但我终究无法弄清楚为什么我的图形不会t 显示在我的 jframe 中。我是 Java G
我是一名优秀的程序员,十分优秀!