不同窗口缩放设置的Java swing调整图像大小图标
我正在尝试使用ZuluJDK11创建一个小型swing应用程序。在它的右下角我有一个图像(标志)。我的问题是,当用户将缩放比例更改为大于100%(125%、150%、175%等)的值时,徽标显示不佳 这是我的源代码 主要类别:不同窗口缩放设置的Java swing调整图像大小图标,java,swing,scaling,java-11,Java,Swing,Scaling,Java 11,我正在尝试使用ZuluJDK11创建一个小型swing应用程序。在它的右下角我有一个图像(标志)。我的问题是,当用户将缩放比例更改为大于100%(125%、150%、175%等)的值时,徽标显示不佳 这是我的源代码 主要类别: public class Main { public static void main(String[] args) { FrameServer frameServer = new FrameServer(); frameServer.setVisibl
public class Main {
public static void main(String[] args) {
FrameServer frameServer = new FrameServer();
frameServer.setVisible(true);
}}
FrameServer类:
公共类FrameServer扩展了JFrame{
private JPanel contentPane;
private JPanel centerPane = new JPanel();
private JPanel southPane = new JPanel();
private JPanel rightPane = new JPanel();
private JButton btnOK = new JButton("OK");
private JTabbedPane jTabbedPane1 = new JTabbedPane();
private Tab1 tab1Page = new Tab1();
private Tab2 tab2Page = new Tab2();
public FrameServer() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
jbInit();
pack();
centerFrame();
this.repaint();
}
private void jbInit() {
setTitle("Test Scaling App");
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new BorderLayout());
centerPane.setLayout(new BorderLayout());
centerPane.add(jTabbedPane1, BorderLayout.CENTER);
southPane.setLayout(new BorderLayout());
rightPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
rightPane.add(btnOK);
CustomStatusBar statusBar = new CustomStatusBar();
southPane.add(statusBar, BorderLayout.CENTER);
southPane.add(rightPane, BorderLayout.EAST);
jTabbedPane1.addTab("Tab 1", tab1Page);
jTabbedPane1.addTab("Tab 2", tab2Page);
contentPane.add(centerPane, BorderLayout.CENTER);
contentPane.add(southPane, BorderLayout.SOUTH);
}
private void centerFrame() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
}
class Tab2 extends JScrollPane {
public Tab2() {
super(new JTextArea(10, 60));
super.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
super.getViewport().setPreferredSize(new Dimension(500, 300));
}
}
class Tab1 extends JPanel {
public Tab1() {
contentPane = this;
JScrollPane centerScrollPane = new JScrollPane(new JTable());
centerScrollPane.getViewport().setBackground(Color.white);
JPanel eastPane = new JPanel();
eastPane.setLayout(new FlowLayout());
JPanel topPane = new JPanel();
topPane.setLayout(new BoxLayout(topPane, BoxLayout.Y_AXIS));
eastPane.add(topPane, FlowLayout.LEFT);
contentPane.setLayout(new BorderLayout());
contentPane.add(centerScrollPane, BorderLayout.CENTER);
contentPane.add(eastPane, BorderLayout.EAST);
}
}
class CustomStatusBar extends JPanel {
JLabel label0 = new JLabel("", SwingConstants.CENTER);
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
JLabel label3 = new JLabel("", SwingConstants.CENTER);
JLabel labelLogo = new JLabel();
private static final int HEIGHT = 21;
public CustomStatusBar() {
setCommonFeatures(label0, 40, "Stuff 0");
setCommonFeatures(label1, 120, "Stuff 1");
setCommonFeatures(label2, 120, "Stuff 2");
setCommonFeatures(label3, 90, "Stuff 3");
labelLogo.setFont(new java.awt.Font("Dialog", 3, 12));
labelLogo.setForeground(Color.black);
labelLogo.setBorder(BorderFactory.createLoweredBevelBorder());
ImageIcon image = new ImageIcon("small.png");
labelLogo.setIcon(image);
labelLogo.setPreferredSize(new Dimension(40, HEIGHT));
labelLogo.setHorizontalAlignment(SwingConstants.CENTER);
setLayout(new GridBagLayout());
setMaximumSize(new Dimension(800, 40));
add(label0, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 50, 0));
add(label1, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 50, 0));
add(label2, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 50, 0));
add(label3, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 50, 0));
add(labelLogo, new GridBagConstraints(4, 0, GridBagConstraints.REMAINDER, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 50, 0));
}
private void setCommonFeatures(JLabel label, int width, String msg) {
label.setBackground(UIManager.getColor("ScrollBar.track"));
label.setForeground(Color.black);
label.setBorder(BorderFactory.createLoweredBevelBorder());
label.setPreferredSize(new Dimension(width, HEIGHT));
label.setText(" " + msg);
}
}}
Small.png图像文件:
当以100%的比例打开时,它看起来很好:
但当将缩放比例更改为175%时:
像素开始显示(打开图片链接以更好地查看)
现在,我所做的是用分辨率更高的徽标替换徽标:
现在,我震惊了,因为我不知道如何使它适合可用空间,并在缩放时正确显示。如果我从java代码中重新确定图像的尺寸,它将以100%的比例正确显示,但在175%的缩放比例下,像素将再次可见,就像使用small.png文件一样
解决这个问题的正确方法是什么?
谢谢。请参阅:。查看
StretchIcon
,它将根据标签的可用空间动态缩放。尝试过此操作后,不幸的是,即使在100%缩放设置下,它也会变得模糊:(可能尝试:1)使图像变小。也就是说,它应该只有常规大小的2倍,因为缩放将仅达到175%。2)可能会使背景透明,而不是白色。3)在创建图像时使用抗锯齿。不幸的是,这也不起作用…内置的降尺度算法不是很好,特别是对于像logo。我们改用类似的方法。但仍然最好使用支持多个图像并选择最接近的图像的图标实现。您可以通过将图形
强制转换为图形2D
和仿射变换CurrTransform=g2d.getTransform();双scaleX=currTrans.getScaleX()来获得缩放因子,scaleY=currTrans.getScaleY();
请参见:。查看将根据标签可用空间动态缩放的StretchIcon
。尝试过此操作后,不幸的是,即使在100%缩放设置下,它也会呈现模糊:(可能尝试:1)使图像变小。也就是说,它应该只有常规大小的2倍,因为缩放将仅达到175%。2)可能会使背景透明,而不是白色。3)在创建图像时使用抗锯齿。不幸的是,这也不起作用…内置的降尺度算法不是很好,特别是对于像logo。我们改用类似的方法。但仍然最好使用支持多个图像并选择最接近的图像的图标实现。您可以通过将图形
强制转换为图形2D
和仿射变换CurrTransform=g2d.getTransform();双scaleX=currTrans.getScaleX()来获得缩放因子,scaleY=currTrans.getScaleY();