如何将一个应用程序(例如计算器)嵌入到java的窗体中

解决方案 »

  1.   

    首先要搞清 所嵌入的是什么语言编写的,
    其次如果是java写的,那么你可以对这个程序进行封装,取它的核心代码,放到自己的java窗体中
    如果是其他的语言,那么你也要对这个程序进行封装,最好是以接口的形式出现,然后利用jdni或是webservices
    进行跨语言调用。
    还有一种方法,你可以再2个软件中利用xml的文档进行传输数据,不过这种方法对封装和安全的性能比较低。
      

  2.   

    我说的应用程序(例如计算器),就是问 windows下的计算器calc.exe
    调用当然是没哟问题的
    我想把计算器嵌入到我的窗口中
    就象在panel中可以嵌入窗口一样
      

  3.   

    如果只是要一个计算器,  自己开发吧,应该很快的。 如果你把Windows的计算器嵌入进来,那么在其他操作系统上怎么运行?java的跨平台性呢?
      

  4.   

    JAVA版计算器,多多。http://www.google.cn/search?hl=zh-CN&q=java+%E8%AE%A1%E7%AE%97%E5%99%A8&meta=&aq=f&oq=
      

  5.   

    我想他是想问:“如何将一个应用程序(即后缀为exe)嵌入到java的窗体中”这是我猜测的,对不对就不知道了。
      

  6.   

    其实VB、Delphi中是有这种功能,不叫做嵌入,叫绑架,就是将系统的窗体强制性的捆绑到我的应用程序中,VB和Delphi都可以实现的,这个不知道在Java能否实现,没有试过。
    关注
      

  7.   

    这个问题是没法解决得。你想,在Java中只有容器可以嵌入其他组件,那么你说的计算器,如果是非Java组件是无法嵌入到容器中。所以只能通过Runtime类去调用执行。没法嵌入。
      

  8.   

    ole 直接求嵌进去了, 建议用ole
      

  9.   

    不明白什么意思,难道你的程序不是在窗体里做的?
    看看这个:package boom;import javax.swing.*;
    import javax.swing.border.Border;
    import java.awt.*;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.util.HashMap;/**
     * 我的计算器。MyCalculator 继承于 JFrame,是计算器的界面
     */
    public class MyCalculator extends JFrame { private static final long serialVersionUID = 1L; private Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5); private JTextField textbox = new JTextField("0"); private CalculatorCore core = new CalculatorCore(); private ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) {
    JButton b = (JButton) e.getSource();
    String label = b.getText();
    String result = core.process(label);
    textbox.setText(result);
    }
    }; public MyCalculator(String title) throws HeadlessException {
    super(title); // 调用父类构造方法
    setupFrame(); // 调整窗体属性
    setupControls(); // 创建控件
    } private void setupControls() {
    setupDisplayPanel(); // 创建文本面板
    setupButtonsPanel(); // 创建按钮面板
    } // 创建按钮面板并添加按钮
    private void setupButtonsPanel() {
    JPanel panel = new JPanel();
    panel.setBorder(border);
    panel.setLayout(new GridLayout(4, 5, 3, 3)); createButtons(panel, new String[] { "7", "8", "9", "+", "C", "4", "5",
    "6", "-", "CE", "1", "2", "3", "*", "", // 空字符串表示这个位置没有按钮
    "0", ".", "=", "/", "" }); this.add(panel, BorderLayout.CENTER);
    } /**
     * 在指定的面板上创建按钮
     * 
     * @param panel
     *            要创建按钮的面板
     * @param labels
     *            按钮文字
     */
    private void createButtons(JPanel panel, String[] labels) {
    for (String label : labels) {
    // 如果 label 为空,则表示创建一个空面板。否则创建一个按钮。
    if (label.equals("")) {
    panel.add(new JPanel()); } else {
    JButton b = new JButton(label);
    b.addActionListener(listener); // 为按钮添加侦听器
    panel.add(b);
    }
    }
    } // 设置显示面板,用一个文本框来作为计算器的显示部分。
    private void setupDisplayPanel() {
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBorder(border); setupTextbox();
    panel.add(textbox, BorderLayout.CENTER);
    this.add(panel, BorderLayout.NORTH);
    } // 调整文本框
    private void setupTextbox() {
    textbox.setHorizontalAlignment(JTextField.RIGHT); // 文本右对齐
    textbox.setEditable(false); // 文本框只读
    textbox.setBackground(Color.white); // 文本框背景色为白色
    } // 调整窗体
    private void setupFrame() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 当窗体关闭时程序结束
    this.setLocation(100, 50); // 设置窗体显示在桌面上的位置
    this.setSize(300, 200); // 设置窗体大小
    this.setResizable(false); // 窗体大小固定
    } // 程序入口
    public static void main(String[] args) throws Exception {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    MyCalculator frame = new MyCalculator("我的计算器");
    frame.setVisible(true); // 在桌面上显示窗体
    }
    }/**
     * 计算器核心逻辑。这个逻辑只能处理 1~2 个数的运算。
     */
    class CalculatorCore { private String displayText = "0"; // 要显示的文本 boolean reset = true; private BigDecimal number1, number2; private String operator; private HashMap<String, Operator> operators = new HashMap<String, Operator>(); private HashMap<String, Processor> processors = new HashMap<String, Processor>(); CalculatorCore() {
    setupOperators();
    setupProcessors();
    } // 为每种命令添加处理方式
    private void setupProcessors() {
    processors.put("[0-9]", new Processor() {
    public void calculate(String command) {
    numberClicked(command);
    }
    });
    processors.put("\\.", new Processor() {
    public void calculate(String command) {
    dotClicked();
    }
    });
    processors.put("=", new Processor() {
    public void calculate(String command) {
    equalsClicked();
    }
    });
    processors.put("[+\\-*/]", new Processor() {
    public void calculate(String command) {
    operatorClicked(command);
    }
    });
    processors.put("C", new Processor() {
    public void calculate(String command) {
    clearClicked();
    }
    });
    processors.put("CE", new Processor() {
    public void calculate(String command) {
    clearErrorClicked();
    }
    });
    } // 为每种 operator 添加处理方式
    private void setupOperators() {
    operators.put("+", new Operator() {
    public BigDecimal process(BigDecimal number1, BigDecimal number2) {
    return number1.add(number2);
    }
    });
    operators.put("-", new Operator() {
    public BigDecimal process(BigDecimal number1, BigDecimal number2) {
    return number1.subtract(number2);
    }
    });
    operators.put("*", new Operator() {
    public BigDecimal process(BigDecimal number1, BigDecimal number2) {
    return number1.multiply(number2);
    }
    });
    operators.put("/", new Operator() {
    public BigDecimal process(BigDecimal number1, BigDecimal number2) {
    return number1.divide(number2, 30, RoundingMode.HALF_UP);
    }
    });
    } // 根据命令处理。这里的命令实际上就是按钮文本。
    public String process(String command) {
    for (String pattern : processors.keySet()) {
    if (command.matches(pattern)) {
    processors.get(pattern).calculate(command);
    break;
    }
    } return displayText;
    } // 当按下 CE 时
    private void clearErrorClicked() {
    if (operator == null) {
    number1 = null;
    } else {
    number2 = null;
    }
    displayText = "0";
    reset = true;
    } // 当按下 C 时,将计算器置为初始状态。
    private void clearClicked() {
    number1 = null;
    number2 = null;
    operator = null;
    displayText = "0";
    reset = true;
    } // 当按下 = 时
    private void equalsClicked() {
    calculateResult();
    number1 = null;
    number2 = null;
    operator = null;
    reset = true;
    } // 计算结果
    private void calculateResult() {
    number2 = new BigDecimal(displayText);
    Operator oper = operators.get(operator);
    if (oper != null) {
    BigDecimal result = oper.process(number1, number2);
    displayText = result.toString();
    }
    } // 当按下 +-*/ 时(这里也可以扩展成其他中间操作符)
    private void operatorClicked(String command) {
    if (operator != null) {
    calculateResult();
    } number1 = new BigDecimal(displayText);
    operator = command; reset = true;
    } // 当按下 . 时
    private void dotClicked() {
    if (displayText.indexOf(".") == -1) {
    displayText += ".";
    } else if (reset) {
    displayText = "0.";
    }
    reset = false;
    } // 当按下 0-9 时
    private void numberClicked(String command) {
    if (reset) {
    displayText = command;
    } else {
    displayText += command;
    }
    reset = false;
    } // 运算符处理接口
    interface Operator { BigDecimal process(BigDecimal number1, BigDecimal number2);
    } // 按钮处理接口
    interface Processor { void calculate(String command);
    }}