随笔 - 1  文章 - 37  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

test

搜索

  •  

最新评论

在开发一个基于Eclipse的产品应用中,类似于Eclipse控制台的小部件是必不可少的,例如:
1. 开发过程中需要一个控制台来专门输出调试信息,而在产品发布后却不需要
2. 需要一个控制台用于输出系统信息
3. 需要一个控制台用于输出普通消息

先定义个简单的接口MConsole
public interface MConsole {
    
    
public MessageConsole getMessageConsole();
    
    
public void println(String msg);

}


MConsoleFactory 还是需要的,就像Log4j的Logger一样,要控制台的时候,只需要来一条如下语句就可以了
private static final MConsole mConsole = MConsoleFactory.CONSOLE_SYSTEM;

public class MConsoleFactory {

    
public static final MConsole CONSOLE_MESSAGE = new AbstractMConsole(
            
new MessageConsole("控制台"null));
    
public static final MConsole CONSOLE_SYSTEM = new AbstractMConsole(
            
new MessageConsole("控制台"null));
    
public static final MConsole DEBUG_SYSTEM = new AbstractMConsole(
            
new MessageConsole("控制台"null));

    
static{
        
{

            IConsoleManager manager 
= ConsolePlugin.getDefault()
                    .getConsoleManager();
            
// IConsole[] existing = manager.getConsoles();
            manager.addConsoles(new IConsole[] {
                    CONSOLE_SYSTEM.getMessageConsole(),
                    CONSOLE_MESSAGE.getMessageConsole(),
                    DEBUG_SYSTEM.getMessageConsole() }
);

        }

    }


    
private MConsoleFactory() {
    }

}

接下来就是AbstractMConsole了
class AbstractMConsole implements MConsole {
    
    
private MessageConsole console;
    
    
private MessageConsoleStream stream= null;
    
    
public AbstractMConsole(MessageConsole console){
        
this.console = console;
        
this.stream = console.newMessageStream();
    }

    
    
/**
     * 这个MessageConsole应该避免暴露
     
*/

    
public MessageConsole getMessageConsole(){
        
return this.console;
    }

    
/**
     * 这里的println有很大的发挥空间
     
*/

    
public void println(String msg){
        StringBuffer sb 
= new StringBuffer();
        sb.append(
new SimpleDateFormat("[HH:mm:ss]").format(new Date()));
        sb.append(msg);
        
this.stream.println(sb.toString());
    }


}

上面3个部分只是在MConsoleFactory中加入了3个MessageConsole,下面的代码就是具体的部分了
先看看[系统消息控制台]

public class ConsoleView extends ViewPart {

    
public static final String ID = "donf.yang.mir3g.ui.view.consoleView";

    
public ConsoleView() {
    }


    @Override
    
public void createPartControl(Composite parent) {
        MessageConsole mainConsole 
= MConsoleFactory.CONSOLE_SYSTEM
                .getMessageConsole();
        
final TextConsoleViewer tcv = new TextConsoleViewer(parent, mainConsole);
        
/* 如果这个console不是在第一个lab,当切换到该lab时,如果要自动滚屏到最后一条输出,需要加下面这行 */
        toTopIndex(tcv);
        tcv.addTextListener(
new ITextListener() {
            
public void textChanged(TextEvent event) {
                toTopIndex(tcv);
            }

        }
);

        
/**
         * 下面2行注释的代码也是与上面的toTopIndex具有相同的功效, 只是看起来有点别扭,因为会延迟50毫秒,具体请参照Eclipse的代码
         
*/

        
// IOConsoleViewer iov = new IOConsoleViewer(parent,mainConsole);
        
// iov.setAutoScroll(true);
    }


    
/**
     * 自动滚屏
     * 
     * 
@param tcv
     
*/

    
private void toTopIndex(final TextConsoleViewer tcv) {
        StyledText textWidget 
= tcv.getTextWidget();
        
if (textWidget != null && !textWidget.isDisposed()) {
            
int lineCount = textWidget.getLineCount();
            tcv.setTopIndex(lineCount 
- 1);
        }

    }


    @Override
    
public void setFocus() {
    }


    
/**
     * 这个才是控制台的名字
     
*/

    
public String getPartName() {
        
return "系统消息";
    }


}

其他2个View也是这样的代码了,只是名字不同

这样设计出来的控制台有较好的扩展性,耦合度也较低,至于Log4的应用需要在createPartControl中加入如下代码

MessageConsoleStream stream = mainConsole.newMessageStream();
        System.setOut(
new PrintStream(stream));
        
try {
            Properties props 
= new Properties();
            props.load(
this.getClass().getResourceAsStream("/log4j.properties"));
            PropertyConfigurator.configure(props);
        }
 catch (Exception e) {

        }

posted on 2008-06-10 11:20 Phrancol Yang 阅读(1257) 评论(2)  编辑  收藏 所属分类: Eclipse

FeedBack:
# re: [原]Eclipse产品应用——控制台的使用 2008-07-03 10:21 冰河の泥鱼
如果代码全一些就会更好了.发现MessageConsole这个类没有.  回复  更多评论
  
# re: [原]Eclipse产品应用——控制台的使用 2008-07-03 10:23 冰河の泥鱼
哈,找到了.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: