0

无论我做什么,我都无法在屏幕上显示矩形/线条/椭圆形。我检查了他们绘制图形的其他来源,但是当我什至执行这些代码时,我没有在窗口上显示任何图形。下面是教科书上的例子。

import java.awt.*;
import javax.swing.*;

class PlotGraph
{
   public static void main (String [] args) {
    JFrame win;
    Container contentPane;
    Graphics g;

    win = new JFrame("testing");
    win.setSize(300,200);
    win.setLocation(100,100);
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    win.setVisible(true);

    contentPane = win.getContentPane();
    g = contentPane.getGraphics();

    g.drawRect(10, 30, 50, 50); 

   }

}
4

2 回答 2

3

哎哟。你应该改变你的教科书。首先,所有对 Swing 组件的访问都必须在事件派发线程中完成。

其次,您不应该获取组件的图形并在其上进行绘制。相反,您应该扩展 JComponent 或 JPanel,覆盖其paintComponent(Graphics)方法,并使用作为参数传递的 Graphics 对象(实际上是一个Graphics2D实例)进行绘制。

于 2013-03-12T23:25:59.157 回答
1

这不是图形在 Swing 中的工作方式。

您需要将组件添加到框架中,而不仅仅是在其上绘制。你永远不想直接在框架上绘图。它没有做任何事情的原因是因为您的绘图代码被覆盖了。

如果您希望您的组件具有自定义绘图代码,请创建一个子类JComponent并覆盖该paintComponent(Graphics)方法。您应该如何执行此操作的示例如下:

import java.awt.*;
import javax.swing.*;

class PlotGraph {
    public static void main(String[] args) {
        JFrame win;

        win = new JFrame("testing");
        win.setSize(300, 200);
        win.setLocation(100, 100);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setVisible(true);
        win.setContentPane(new MyComponent());
    }

}

class MyComponent extends JComponent {

    @Override
    public void paintComponent(Graphics g) {
        g.drawRect(10, 30, 50, 50);
    }
}

强烈建议您在线查看Java GUI 教程

于 2013-03-12T23:29:50.353 回答