难以调整存储在JLabel中的图像的大小

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();

    }


}

在减少动作侦听器中将g.scale(scale,scale);更改为g.scale(0.5d,0.5d);

或者您可以这样做...

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());
        }
    }
}