构造矩形

时间:2015-09-14 17:41:43

标签: java

我正在构建一个yearCalendarView类。我尝试了很多次并观看了很多教程,但我的程序无效。到目前为止,这是我的代码:

require(cluster)

X <- EuStockMarkets
kmm <- kmeans(X, 8)

D <- daisy(X)
plot(silhouette(kmm$cluster, D), col=1:8)

3 个答案:

答案 0 :(得分:112)

假设

我假设您不熟悉Java语言的语法,并尝试拼凑您的第一个Java类。

我还假设您需要以下内容:

  1. Rectangle
  2. 的定义
  3. 属性xy,表示Rectangle的来源。
  4. 属性widthheight,表示Rectangle的尺寸。
  5. 通过指定这四个关键属性来创建Rectangle的能力。
  6. 能够显示现有Rectangle
  7. 的属性

    你已经拥有什么

    现在,你有一个良好的开端,但它有点交叉。

    你的第一行和最后一行:

    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 { } xywidth。我们班现在看起来像这样:

    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);
    }
}