我正在制作一个应用程序来控制串行附加打印机,我想提供一个静态工厂方法PrinterLocator.FindPrinters(),它将返回连接到我的系统的可用打印机数组。
例如,Serial提供了Serial.list(),它是一个静态方法,返回与我的系统中可用端口相对应的字符串数组。我正在尝试创建类似的东西,但我得到了一个错误:“不能访问SLPDriver类型的封闭实例。必须用SLPDriver类型的封闭实例限定分配”。
实现这种设计模式的正确方法是什么?
SLPDriver:
SerialPrinter myPrinter;
void setup()
{
SerialPrinter[] availablePrinters = PrinterLocator.FindPrinters();
if(availablePrinters.length > 0)
{
myPrinter = availablePrinters[0];
}
}
void draw()
{
}SerialPrinter:
import processing.serial.*;
static class PrinterLocator
{
static final int baudRates[] = {2400, 4800, 9600, 19200, 38400, 57600, 115200};
static final int baudCount = baudRates.length;
static SerialPrinter[] FindPrinters()
{
SerialPrinter[] foundPrinters, tempPrinters;
foundPrinters = new SerialPrinter[0];
String[] foundPorts = Serial.list();
int numPorts = foundPorts.length;
int numPrintersFound = 0;
if(numPorts <= 0) return foundPrinters;
SerialPrinter testPrinter;
tempPrinters = new SerialPrinter[numPorts];
for(int i = 0; i < numPorts; i++)
{
for(int b = 0; b < baudCount; b++)
{
testPrinter = new SerialPrinter("test", foundPorts[i], baudRates[b]);
if(testPrinter.IsValid())
{
tempPrinters[numPrintersFound] = testPrinter;
numPrintersFound++;
break;
}
}
}
if(numPrintersFound > 0)
{
foundPrinters = new SerialPrinter[numPrintersFound];
for(int i = 0; i < numPrintersFound; i++)
{
foundPrinters[i] = tempPrinters[i];
}
}
return foundPrinters;
}
}
class SerialPrinter
{
//Members
private Serial myPort;
private String printerName;
private boolean valid;
private String portName;
private int baudRate;
public SerialPrinter()
{
this("","",0);
}
public SerialPrinter(String name, String port, int baud)
{
printerName = name;
Configure(port, baud);
}
public boolean IsValid()
{
return valid;
}
public boolean Configure(String port, int baud)
{
print("Configuring Printer ");
print(port);
print("@");
print(baud);
print(": ");
try
{
myPort.stop();
myPort = null;
}
catch (Exception e) {}
portName = port;
baudRate = baud;
try
{
myPort = new Serial(this, port, baud);
myPort.clear();
myPort.write(0xA5);
int timeout = millis() + 1000;
while((millis() < timeout) && (myPort.available() == 0)) { }
if(myPort.available() > 0)
{
int inByte = myPort.read();
if(inByte == 0xC9)
{
valid = true;
}
else
{
valid = false;
}
}
else
{
valid = false;
}
}
catch (Exception e)
{
valid = false;
}
if(valid)
{
println("[OK]");
}
else
{
println("[ERR]");
}
return valid;
}
}发布于 2015-02-08 00:50:39
不能访问SLPDriver类型的封闭实例。必须使用SLPDriver类型的封闭实例限定分配。
错误指示SerialPrinter是SLPDriver的内部类。
您需要将类声明更改为静态:
static class SerialPrinter
{
...或者,如果它应该在内部,则需要使用SLPDriver实例来创建SerialPrinter
someSLPDriver.new SerialPrinter(...)http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Serial构造函数似乎需要一个PApplet实例。实例化表达式也会给出一个错误,因为this引用的是SerialPrinter,而不是PApplet。
您可以尝试如下所示:
...
static class PrinterLocator {
...
static SerialPrinter[] FindPrinters(SLPDriver context) {
...
... = context.new SerialPrinter(...);
}
}
class SerialPrinter {
...
public boolean Configure(...) {
...
... = new Serial(PApplet.this, ...);
}
}当您在applet上下文中调用FindPrinters时,您需要调用它如下
... = PrinterLocator.FindPrinters(this);https://stackoverflow.com/questions/28388956
复制相似问题