пример использования JavaAdapter от Rhino - PullRequest
4 голосов
/ 07 августа 2010

Может ли кто-нибудь предоставить мне пример того, как расширить класс Java в сценарии Java с помощью адаптера Java Rhino?

Ответы [ 4 ]

6 голосов
/ 28 июня 2012

Для всех, кто может столкнуться с этим, есть достойный пример здесь (автор использует его для расширения awt.Canvas).

var smileyCanvas = new JavaAdapter(awt.Canvas, {
   paint: function (g) {
       var size = this.getSize();
       var d = Math.min(size.width, size.height);
       var ed = d / 20;
       var x = (size.width - d) / 2;
       var y = (size.height - d) / 2;
       // draw head (color already set to foreground)
       g.fillOval(x, y, d, d);
       g.setColor(awt.Color.black);
       g.drawOval(x, y, d, d);
       // draw eyes
       g.fillOval(x+d/3-(ed/2), y+d/3-(ed/2), ed, ed);
       g.fillOval(x+(2*(d/3))-(ed/2), y+d/3-(ed/2), ed, ed);
       //draw mouth
       g.drawArc(x+d/4, y+2*(d/5), d/2, d/3, 0, -180);
   }
});

Там больше информациина MDN , включая краткое объяснение и пример синтаксиса вызова.

2 голосов
/ 07 августа 2010

Поскольку я не уверен на 100%, что под «Адаптером Java» вы подразумеваете то, что я думаю, интерфейсы Java и тому подобное можно создавать с помощью списков свойств (name = function ()):

var runnable = new java.lang.Runnable({
   run: function() { println('hello world!'); } // uses methodName: implementationFunction convention
};
java.awt.EventQueue.invokeLater(runnable); // test it

Или, в качестве альтернативы, для подобных вещей:

function runnableFunc() { println('hello world!'); }
var runnable = new java.lang.Runnable(runnableFunc); // use function name
java.awt.EventQueue.invokeLater(runnable); // test it
1 голос
/ 07 августа 2010

Зависит от того, что вы хотите унаследовать.Я обнаружил, что если я использую прототип JavaScript для «определений» объектов, я получаю только статические методы объектов Java:

function test() {
  this.hello = function() {
    for(var i in this) {
      println(i);
    }
  };
}
test.prototype= com.acme.app.TestClass; // use your class with static methods
// see the inheritance in action:
var testInstance=new test();
test.hello();

Однако JavaScript позволяет вам также выполнять назначения прототипов для экземпляров объектов, так что выможет использовать функцию, подобную этой, и получить более похожее на Java поведение наследования:

function test(baseInstance) {
  var obj = new function() {
    this.hello=function() { 
      for(var i in this) { 
        println(i); 
      }
    };
  };
  obj.prototype=baseInstance; // inherit from baseInstance.
}

// see the thing in action:
var testInstance=test(new com.acme.TestClass()); // provide your base type
testInstance.hello();

Или использовать функцию (например, init), аналогичную приведенной выше функции в самом объекте:

function test() {
  this.init=function(baseInstance) {
    this.prototype=baseInstance;
  };
  this.hello=function() {
    for(var i in this) {
      println(i);
    }
  };
}

var testInstance=new test();
println(typeof(testInstance.prototype)); // is null or undefined
testInstance.init(new com.acme.TestClass()); //  inherit from base object

// see it in action:
println(typeof(testInstance.prototype)); // is now com.acme.TestClass
testInstance.hello();
0 голосов
/ 15 апреля 2014

Например, запуск темы в Rhino:

function startThread(funcOfThread) {
    var someClass = { run: funcOfThread }; // Rhino syntax for new class with overwritten method
    var r = new java.lang.Runnable(someClass);
    var t = new java.lang.Thread(r);
    t.start();
}

function UDP_Client() {
    while (1)
        java.lang.Thread.sleep(100);
}

startThread(UDP_Client);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...