Difficulty in resizing an image which is stored in a JLabel
我设法增加了JLabel的图像(其中存储了imageIcon)。当我按下增加大小按钮时,图像的原始大小会在面板上增加,这正是我想要的。但是,当我单击减小尺寸按钮(我认为将其除以比例可能会固定它)时,标签会减小,但实际的图像外观(我猜想的尺寸)已更改。它并没有减小尺寸,就像增加按钮增大尺寸一样。我花了数小时试图找出原因,然后乘以它,可以增加标签和标签中图像的大小(这意味着不仅标签在增加,实际图像也在增加),但减少了(我是除法而不是乘法),它不起作用。这是我的增加和减少的侦听器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class IncreaseSizeListener implements ActionListener { static JLabel increasedLabel; @Override public void actionPerformed(ActionEvent e) { increasedLabel = CardLabelListener.selectedLabel; Icon icon = CardLabelListener.selectedLabel.getIcon(); int scale =2; System.out.println("Increased size fired"); //I can now resize images, based on my needs BufferedImage bi = new BufferedImage( scale*icon.getIconWidth(), scale*icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); g.scale(scale,scale); icon.paintIcon(null,g,0,0); g.dispose(); JLabel temp = new JLabel(new ImageIcon(bi)); //to ensure proper size is kept for the enlarged image CardLabelListener.selectedLabel.setSize(icon.getIconWidth()*scale, icon.getIconHeight()*(scale)); CardLabelListener.selectedLabel.setIcon(temp.getIcon()); CardLabelListener.selectedLabel.updateUI(); } } public class DecreaseSizeListener implements ActionListener { static JLabel increasedLabel; @Override public void actionPerformed(ActionEvent e) { increasedLabel = CardLabelListener.selectedLabel; Icon icon = CardLabelListener.selectedLabel.getIcon(); int scale =2; //I can now resize images, based on my needs BufferedImage bi = new BufferedImage( icon.getIconWidth()/scale, icon.getIconHeight()/scale, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); g.scale(scale,scale); icon.paintIcon(null,g,0,0); g.dispose(); JLabel temp = new JLabel(new ImageIcon(bi)); //to ensure proper size is kept for the enlarged image CardLabelListener.selectedLabel.setSize( (icon.getIconWidth()/scale), (icon.getIconHeight()/(scale))); CardLabelListener.selectedLabel.setIcon(temp.getIcon()); CardLabelListener.selectedLabel.updateUI(); } } |
在减少动作侦听器中将
或者您可以这样做...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int scale = 0.5; //I can now resize images, based on my needs BufferedImage bi = new BufferedImage( icon.getIconWidth() * scale, icon.getIconHeight() * scale, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); g.scale(scale,scale); icon.paintIcon(null,g,0,0); g.dispose(); // This really isn't required... //JLabel temp = new JLabel(new ImageIcon(bi)); //to ensure proper size is kept for the enlarged image // There is a better way... //CardLabelListener.selectedLabel.setSize( (icon.getIconWidth()/scale), (icon.getIconHeight()/(scale))); // This isn't required //CardLabelListener.selectedLabel.setIcon(temp.getIcon()); // This doesn't do what you think it does... //CardLabelListener.selectedLabel.updateUI(); CardLabelListener.selectedLabel.setIcon(new ImageIcon(bi)); CardLabelListener.selectedLabel.setSize(CardLabelListener.selectedLabel.getPreferredSize()); |
现在增加和减少算法几乎相同(除因子),您应该可以使用单个方法;)
这几乎是我最终得到的代码...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | public class ScaleMyIcon { public static void main(String[] args) { new ScaleMyIcon(); } public ScaleMyIcon() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new ScaleMyIconPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class ScaleMyIconPane extends JPanel { public ScaleMyIconPane() { setLayout(new BorderLayout()); ImageIcon image = null; try { image = new ImageIcon(ImageIO.read(getClass().getResource("/stormtrooper-tie.jpg"))); } catch (IOException ex) { ex.printStackTrace(); } JLabel label = new JLabel(image); add(label); JPanel buttons = new JPanel(); JButton increase = new JButton("+"); JButton decrease = new JButton("-"); buttons.add(increase); buttons.add(decrease); increase.addActionListener(new IncreaseSizeListener(label)); decrease.addActionListener(new DecreaseSizeListener(label)); add(buttons, BorderLayout.SOUTH); } } public class Scaler { public Icon getScaledInstance(Icon original, double scale) { BufferedImage bi = new BufferedImage( (int)Math.round(scale * original.getIconWidth()), (int)Math.round(scale * original.getIconHeight()), BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); g.scale(scale, scale); original.paintIcon(null, g, 0, 0); g.dispose(); return new ImageIcon(bi); } } public class IncreaseSizeListener extends Scaler implements ActionListener { private JLabel increasedLabel; private IncreaseSizeListener(JLabel label) { increasedLabel = label; } @Override public void actionPerformed(ActionEvent e) { Icon icon = increasedLabel.getIcon(); int scale = 2; increasedLabel.setIcon(getScaledInstance(icon, scale)); } } public class DecreaseSizeListener extends Scaler implements ActionListener { private JLabel decreasedLabel; private DecreaseSizeListener(JLabel label) { decreasedLabel = label; } @Override public void actionPerformed(ActionEvent e) { Icon icon = decreasedLabel.getIcon(); decreasedLabel.setIcon(getScaledInstance(icon, 0.5d)); } } } |
使用不同的方法更新
在我搞混的同时,我注意到了两个问题。上下缩放之间没有联盟,并且您从未使用原始图像进行缩放,而是始终缩放脏图像。尝试按比例缩小图像,然后再次备份。
这是我对如何克服这些问题的看法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | public class ScaleMyIcon { public static void main(String[] args) { new ScaleMyIcon(); } public ScaleMyIcon() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new ScaleMyIconPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } protected class ScaleMyIconPane extends JPanel { public ScaleMyIconPane() { setLayout(new BorderLayout()); ImageIcon image = null; try { image = new ImageIcon(ImageIO.read(getClass().getResource("/stormtrooper-tie.jpg"))); } catch (IOException ex) { ex.printStackTrace(); } JLabel label = new JLabel(image); add(label); JPanel buttons = new JPanel(); JButton increase = new JButton("+"); JButton decrease = new JButton("-"); buttons.add(increase); buttons.add(decrease); increase.addActionListener(new IncreaseSizeListener(label)); decrease.addActionListener(new DecreaseSizeListener(label)); add(buttons, BorderLayout.SOUTH); } } public static class Scalable { private JLabel label; private Icon original; private static double scale = 1; private Scalable(JLabel label) { this.label = label; original = label.getIcon(); } public JLabel getLabel() { return label; } public double getScale() { return scale; } public void setScale(double scale) { this.scale = scale; } public void incrementScale(double factor) { setScale(getScale() + factor); } public Icon getScaledInstance() { BufferedImage bi = new BufferedImage( (int) Math.round(scale * original.getIconWidth()), (int) Math.round(scale * original.getIconHeight()), BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); g.scale(scale, scale); original.paintIcon(null, g, 0, 0); g.dispose(); return new ImageIcon(bi); } } public class IncreaseSizeListener extends Scalable implements ActionListener { public IncreaseSizeListener(JLabel label) { super(label); } @Override public void actionPerformed(ActionEvent e) { incrementScale(0.05); getLabel().setIcon(getScaledInstance()); } } public class DecreaseSizeListener extends Scalable implements ActionListener { private DecreaseSizeListener(JLabel label) { super(label); } @Override public void actionPerformed(ActionEvent e) { incrementScale(-0.05); getLabel().setIcon(getScaledInstance()); } } } |