多语言展示
当前在线:1667今日阅读:176今日分享:34

如何使用IntelliJ IDEA来重构代码

IntelliJ IDEA是重构代码的利器坊间盛传,使用IDEA的手法重构的代码,可以不用测试用例保护本文就拿手头的一个有“坏味道”的代码进行重构
工具/原料
1

IntelliJ IDEA

2

java

方法/步骤
1

需要重构的代码:package chapter4;import org.jvnet.substance.skin.CremeCoffeeSkin;import org.jvnet.substance.skin.SubstanceAutumnLookAndFeel;import org.jvnet.substance.skin.SubstanceSaharaLookAndFeel;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.concurrent.TimeUnit;/** * Created by MyWorld on 2016/3/24. */public class SwingJProgressBarDemo {    public static void main(String[] args) throws UnsupportedLookAndFeelException {        UIManager.setLookAndFeel(new SubstanceAutumnLookAndFeel());        SubstanceSaharaLookAndFeel.setSkin(new CremeCoffeeSkin());        SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                final JFrame frame = new JFrame("JProgressBarDemo");                frame.setSize(400, 200);                frame.setLocationRelativeTo(null);                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setLayout(new FlowLayout());                final JProgressBar progressBar = new JProgressBar();                progressBar.setOrientation(JProgressBar.HORIZONTAL);                progressBar.setSize(200, 100);                progressBar.setMinimum(0);                progressBar.setMaximum(100);                progressBar.setBorderPainted(true);//                progressBar.setUI(new MetalProgressBarUI());//                progressBar.setBackground(Color.green);//                progressBar.setForeground(Color.BLUE);                progressBar.setStringPainted(true);                frame.add(progressBar);                JButton btn = new JButton("Start ProgressBar");                btn.addActionListener(new ActionListener() {                    @Override                    public void actionPerformed(ActionEvent e) {                        new Thread((new Runnable() {                            @Override                            public void run() {                                for (int i = 0; i <= 10; i++) {                                    final int finalI = i;                                    SwingUtilities.invokeLater(new Runnable() {                                        @Override                                        public void run() {                                            progressBar.setValue(finalI * 10);                                       }                                    });                                    try {                                        TimeUnit.SECONDS.sleep(1);                                    } catch (InterruptedException e1) {                                        e1.printStackTrace();                                    }                                }                            }                        })).start();                    }                });                frame.add(btn);                frame.setVisible(true);            }        });    }}

2

先把JButton按钮的监听事件抽取出来把光标放在new ActionListener()的任一位置,同时按下Ctrl+W,按三次,即可选中需要抽取的内容:new ActionListener() {    @Override    public void actionPerformed(ActionEvent e) {        new Thread((new Runnable() {            @Override            public void run() {                for (int i = 0; i <= 10; i++) {                    final int finalI = i;                    SwingUtilities.invokeLater(new Runnable() {                        @Override                        public void run() {                            progressBar.setValue(finalI * 10);                        }                    });                    try {                        TimeUnit.SECONDS.sleep(1);                    } catch (InterruptedException e1) {                        e1.printStackTrace();                    }                }            }        })).start();    }}

3

同时按下Ctrl+Alt+v按提示输入变量名:listener

4

把光标放在run方法块中任一位置,同时按Ctrl+w键,然后再多次按w键,直到能选中全部run方法内的内容

5

然后,同时按下Ctrl+Alt+m在Choose Destination Class的选项中,选择“SwingJProgressBarDemo”也就是当前测试类回车

6

在弹出的对话框中输入方法名:initGUI回车

7

再使用move method的手法将initGUI转换为SwingJProgressBarDemo的普通方法操作手法见前面的分享看看重构后的代码:package chapter4;import org.jvnet.substance.skin.CremeCoffeeSkin;import org.jvnet.substance.skin.SubstanceAutumnLookAndFeel;import org.jvnet.substance.skin.SubstanceSaharaLookAndFeel;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.concurrent.TimeUnit;/** * Created by MyWorld on 2016/3/24. */public class SwingJProgressBarDemo {    public static void main(String[] args) throws UnsupportedLookAndFeelException {        UIManager.setLookAndFeel(new SubstanceAutumnLookAndFeel());        SubstanceSaharaLookAndFeel.setSkin(new CremeCoffeeSkin());        SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                new SwingJProgressBarDemo().initGUI();            }        });    }    private void initGUI() {        final JFrame frame = new JFrame("JProgressBarDemo");        frame.setSize(400, 200);        frame.setLocationRelativeTo(null);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       frame.setLayout(new FlowLayout());        final JProgressBar progressBar = new JProgressBar();        progressBar.setOrientation(JProgressBar.HORIZONTAL);        progressBar.setSize(200, 100);        progressBar.setMinimum(0);        progressBar.setMaximum(100);        progressBar.setBorderPainted(true);//                progressBar.setUI(new MetalProgressBarUI());//                progressBar.setBackground(Color.green);//                progressBar.setForeground(Color.BLUE);        progressBar.setStringPainted(true);        frame.add(progressBar);        JButton btn = new JButton("Start ProgressBar");        ActionListener listener = new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                new Thread((new Runnable() {                    @Override                    public void run() {                        for (int i = 0; i <= 10; i++) {                            final int finalI = i;                            SwingUtilities.invokeLater(new Runnable() {                                @Override                                public void run() {                                    progressBar.setValue(finalI * 10);                                }                            });                            try {                                TimeUnit.SECONDS.sleep(1);                            } catch (InterruptedException e1) {                                e1.printStackTrace();                            }                        }                    }                })).start();            }        };        btn.addActionListener(listener);        frame.add(btn);        frame.setVisible(true);    }}

推荐信息