我正在构建一个yearCalendarView
类。我尝试了很多次并观看了很多教程,但我的程序无效。到目前为止,这是我的代码:
require(cluster)
X <- EuStockMarkets
kmm <- kmeans(X, 8)
D <- daisy(X)
plot(silhouette(kmm$cluster, D), col=1:8)
答案 0 :(得分:112)
我假设您不熟悉Java语言的语法,并尝试拼凑您的第一个Java类。
我还假设您需要以下内容:
Rectangle
。x
和y
,表示Rectangle
的来源。width
和height
,表示Rectangle
的尺寸。Rectangle
的能力。Rectangle
。现在,你有一个良好的开端,但它有点交叉。
你的第一行和最后一行:
public class Rectangle {
}
定义你的Rectangle类。这用作代码单元和用于制作对象的模板。类定义了方法(行为)和字段/属性(信息),用于指示该类的对象如何操作并描述每个对象上可访问的数据。
简而言之,这定义了可以创建的一般类型的东西;在您的情况下,您需要定义对象在代码中作为Rectangle
的含义。
你的第二行及其后续行动:
public static void main(String[] args) {
}
定义了一个名为main
的静态方法。这里有很多东西需要解释,但就目前而言,只需将其视为Java程序中的入口点即可。如果您将此类作为Java程序运行,则此方法将(几乎)是第一个运行的代码。
下一行:
Rectangle box = new Rectangle(5,10,20,30); // notice the correction here, no curly braces, but a semicolon to end the line of code.
是声明一个名为box
的矩形,然后创建一个新的Rectangle对象,并将该对象分配给名为{{1的变量}}。换句话说,您正在制作名称为box
的新Rectangle
。
关键字box
表示您正在创建new
类型的新对象。括号中的数字是 arguments ,它们定义了有关正在创建的对象的一些内容。这些传递到Rectangle
类的构造函数方法,该方法将这些参数放入新创建的对象中。
但是现在,没有构造函数,因此您的代码在这方面无法正常工作。我会再向下写一个,所以继续阅读。
下一行:
Rectangle
也有点复杂。基本上,System.out.println(new Rectangle()) // NOTE: This is incorrect, see below
方法将文本写入程序的控制台,用户可以在该控制台中看到它。它用于从程序中写出消息,或者在程序中显示变量的内容到屏幕上。
现在,您正在向它传递一个新的System.out.println
对象,这对我来说并不合理。 Rectangle
不是文本,也不是基本变量(如整数,字节,十进制数,单个文本字符或真/假值),所以如果你试图将新的Rectangle对象打印到屏幕上,您将看到Java提供的一些gobbledy-gook文本,如下所示:
Rectangle
但是,我们有一个漂亮的小功能,让我们告诉Java如何将特定类的对象转换为文本字符串;我会在下面告诉你。
首先,我们需要使用Rectangle类。
Rectangle@1a2fc866
有!我们已经定义了一个Rectangle类来制作Rectangle对象。现在,它需要一些属性。我们会说这些是整数,称为public class Rectangle {
}
,x
,y
和width
。我们班现在看起来像这样:
height
好的,很酷。现在,我们如何制作public class Rectangle {
public int x; // Defined with a scope (public), a type (int), and a name (x).
public int y;
public int width, height; // We can do multiple on the same line, if they share the same scope and type.
}
?使用构造函数方法!如果我们在制作新的Rectangle
时不需要有关Rectangle
的信息,我们可以将其保留,并使用Java为我们提供的默认构造函数,但我们确实需要有关矩形的位置,宽度和高度的信息。我们的代码增长到:
public class Rectangle {
public int x;
public int y;
public int width, height;
// This line defines a constructor with 4 parameters: x, y, w, and h.
public Rectangle(int x, int y, int w, int h) {
// This initializes our x, y, width, and height properties to what is passed in.
this.x = x; // We set our current object's x property to the x we're given.
this.y = y; // We have to specify which y is which, so we use this.y to indicate the current object, and y to specify the parameter we're given.
width = w; // We can leave off the "this" part if there's nothing else named "width" visible in the method.
height = h;
}
}
现在我们可以制作Rectangle
对象并指定其位置,宽度和高度。但我们没有计划,因为没有切入点。让我们像您最初一样添加一个,但修复原始代码的一些问题:
public class Rectangle {
public int x;
public int y;
public int width, height;
public Rectangle(int x, int y, int w, int h) {
this.x = x;
this.y = y;
width = w;
height = h;
}
// This is our program's entry point. It's static, and belongs to the Rectangle class, and NOT to the Rectangle objects.
public static void main(String[] args) {
// Inside our main method, let's make a new rectangle object.
// Based on our constructor, the position is {5, 10}, the width is 20, and the height is 30.
Rectangle box = new Rectangle(5, 10, 20, 30);
// Now that it's created and named "box", let's print it out!
// We pass the box variable as an argument to System.out.println,
// and that method prints the box as if it were a string.
System.out.println(box);
}
}
我们现在有一个入口点,我们的程序,它做了一些东西。我们创建一个Rectangle,我们将其分配给名为box
的Rectangle变量。然后,我们尝试将box
作为字符串打印到控制台窗口。如前所述,如果我们现在运行该程序,我们将最终得到如下控制台输出:
Rectangle@1a2fc866
这不是我们想要的;我们想看看Rectangle的位置,高度和宽度是多少!因此,让我们通过添加toString()
方法来改变Java将Rectangle对象转换为文本字符串的方式。我们的Rectangle类现在看起来像这样:
public class Rectangle {
public int x;
public int y;
public int width, height;
public Rectangle(int x, int y, int w, int h) {
this.x = x;
this.y = y;
width = w;
height = h;
}
public static void main(String[] args) {
Rectangle box = new Rectangle(5, 10, 20, 30);
System.out.println(box);
}
// Here is our toString method.
// It's declared as an @Override, which means it overrides the toString method provided by the class that Rectangle is based on (in this case, java.lang.Object).
// The method is in the public scope, returns a String-type value, and is called toString. It doesn't have parameters, so it gets empty parentheses.
@Override
public String toString() {
// Now, we have to return a value from this method.
// Start by declaring a local variable and filling it with some data.
String stringValue = "Rectangle with location {";
// We can "add" strings together to form a bigger string with the contents mashed next to each other (aka "concatenated").
stringValue = stringValue + this.x + ",";
// By "adding" this.y (the current object's y property) to a string, it also gets converted from an integer to a string without us needing to say anything special.
stringValue = stringValue + this.y + "}";
// We can take some shortcuts, too, by using the += operator so we don't have to rewrite stringValue twice every time!
stringValue += ", width: " + this.width;
// Remember, we don't need to use "this" when the name is not ambiguous, but it typically makes it clearer that some data is coming from the object instead of a local variable.
stringValue += ", height: " + height;
// Once we have a result value and no other code needs to be executed, we have to *return* it as the result of the method. Constructors and methods with "void" as their return type do not do this (though void methods can just say "return;")
return stringValue;
}
}
现在,当我们运行程序时,它将打印出以下内容:
Rectangle with location: {5,10}, width: 20, height: 30
我们可以在这里清理toString
方法,所以我们的课程看起来像这样:
public class Rectangle {
public int x;
public int y;
public int width, height;
public Rectangle(int x, int y, int w, int h) {
this.x = x;
this.y = y;
width = w;
height = h;
}
public static void main(String[] args) {
Rectangle box = new Rectangle(5, 10, 20, 30);
System.out.println(box);
}
@Override
public String toString() {
return "Rectangle with location {" + x + "," + y + "}, width: " + width + ", height: " + height;
}
}
现在,我们需要做的是让我们的Rectangle显示在屏幕上。为了做到这一点,我们需要引入AWT框架(Advanced Window Toolkit)和Swing框架。这不是让它显示在屏幕上的唯一方法,但它适用于我们的目的。
感谢@KanadJadhav在他的回答here中发布此示例。
我们需要在文件的顶部添加一些导入,并开始修改我们的main
方法,以便它设置AWT和Swing并使用它们来绘制矩形。将其添加到文件顶部:
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
这些引入了您创建程序窗口并在其上绘制矩形所需的类。我不会详细了解AWT和Swing的工作原理,但我会向您展示您的需求。
为了让你的Rectangle出现在屏幕上,我们需要创建一个窗口,设置它的大小,并在窗口的内容窗格中填充一个组件,该组件将矩形绘制到屏幕上。之后,我们只是让我们的窗口可见,Swing处理所有脏工作,保持我们的程序活着直到窗口关闭。
public static void main(String[] args) {
Rectangle box = new Rectangle(5, 10, 20, 30);
// New stuff - Create a program window and set it up.
JFrame window = new JFrame();
// Tell Swing to exit the program when the program window is closed.
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Set the window boundaries to be 300x300 on the screen, and position it 30 pixels from the top and left edges of the monitor.
window.setBounds(30, 30, 300, 300);
// Get the content pane of the window, and give it our own custom component.
window.getContentPane().add(new JComponent() { // Not a typo - this is some advanced magic called an "anonymous class".
Rectangle myBox = box; // Give the component a reference to our box object.
public void paint(Graphics g) {
g.drawRect(myBox.x, myBox.y, myBox.width, myBox.height);
}
});
// Make our window appear.
window.setVisible(true);
}
这有点草率,很难遵循,所以你不得不原谅我挥手。我觉得我已经解释了评论中的一些棘手问题(比如匿名类 - 这是一个非常先进的Java特性),但总的来说,这是Swing文档显示的代码类型,以及其中大部分内容并不需要完全理解才能被使用。如果您愿意,可以通过我提供的链接中的示例,对Swing framework,AWT Graphics class或Java Anonymous classes进行自己的研究。
答案 1 :(得分:15)
有一些事情需要指出。首先,您的代码无法编译。试试这个。
import java.awt.Rectangle;
public class RectangleExample {
public static void main(String[] args) {
Rectangle box= new Rectangle(5,10,20,30);
System.out.println(box);
}
}
您需要在Rectangle行的末尾使用;
分号而不是括号{
。此外,最好将您的类重命名为与Rectangle不同的内容,以防止在您想要调用Rectangle
类时遇到一些兼容性问题。此外,在打印矩形时,您希望使用框参考而不是构造新的矩形。
第二,这不会在你的屏幕或窗口中绘制一个矩形,这只会打印出矩形toString
方法。根据{{3}},只会打印出a String representing this Rectangle object's coordinate and size values.
。
如果你想实际绘制一个矩形,你需要查看类似JFrame的内容或查看paint
,类似于javadoc
答案 2 :(得分:0)
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
class MyCanvas extends JComponent {
public void paint(Graphics g) {
g.drawRect (10, 10, 200, 200);
}
}
public class Rectangle {
public static void main(String[] a) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 300, 300);
window.getContentPane().add(new MyCanvas());
window.setVisible(true);
}
}