Java 图形绘图未显示在绘图面板上

标签 java graphics awt frame

我正在启动一个非常简单的 Java 程序。用户可以从菜单中选择形状、大小、填充( boolean 值)、lineColor 和 fillColor,然后单击并拖动以在屏幕上绘制所选对象。在这一点上,我只是想弄清楚为什么屏幕上什么也没有画。在 run 方法中,我在 200,200 处绘制了一个简单的矩形,但面板上没有显示任何内容。我有信心,一旦我弄清楚为什么什么都没有绘制,我就能让程序的其余部分正常工作知道我做错了什么吗?

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.lang.*;
import java.awt.Rectangle;

public class E3G04 extends Frame implements WindowListener, ActionListener, ItemListener, MouseListener, MouseMotionListener, Runnable
{
    volatile String type = "rectangle";
    volatile Boolean fill = true;
    Color lineColor = Color.BLACK;
    Color fillColor = Color.BLACK;
    int size = 1;

    private Graphics obj;
    Point start = new Point(100,100);
    Point cur = new Point(100,100);
    Point end = new Point(100,100);

    Panel drawingpanel;
    Thread thread = new Thread(this);
    boolean running = true;

    MenuBar mb = new MenuBar();
        Menu fileMenu = new Menu("File");
            MenuItem newItem = new MenuItem("New (Ctrl-N)");
            MenuItem quitItem = new MenuItem ("Quit (Ctrl-Q)");
        Menu drawMenu = new Menu("Draw");
            Menu typeMenu = new Menu("Type");
                CheckboxMenuItem ovalItem = new CheckboxMenuItem("Oval (Ctrl-O)");
                CheckboxMenuItem rectItem = new CheckboxMenuItem("Rectangle (Ctrl-R)", true);
                CheckboxMenuItem lineItem = new CheckboxMenuItem("Line (Ctrl-L)");
            Menu fillMenu = new Menu ("Fill");
                CheckboxMenuItem fillItem = new CheckboxMenuItem("Fill", true);
                CheckboxMenuItem noFillItem = new CheckboxMenuItem("No Fill");
            Menu colorMenu = new Menu ("Color");
                CheckboxMenuItem blackLineItem = new CheckboxMenuItem("Black Line", true);
                CheckboxMenuItem redLineItem = new CheckboxMenuItem("Red Line");
                CheckboxMenuItem orangeLineItem = new CheckboxMenuItem("Orange Line");
                CheckboxMenuItem yellowLineItem = new CheckboxMenuItem("Yellow Line");
                CheckboxMenuItem greenLineItem = new CheckboxMenuItem("Green Line");
                CheckboxMenuItem blueLineItem = new CheckboxMenuItem("Blue Line");
                CheckboxMenuItem purpleLineItem = new CheckboxMenuItem("Purple Line");
                CheckboxMenuItem grayLineItem = new CheckboxMenuItem("Gray Line");
                CheckboxMenuItem blackFillItem = new CheckboxMenuItem("Black Fill", true);
                CheckboxMenuItem redFillItem = new CheckboxMenuItem("Red Fill");
                CheckboxMenuItem orangeFillItem = new CheckboxMenuItem("Orange Fill");
                CheckboxMenuItem yellowFillItem = new CheckboxMenuItem("Yellow Fill");
                CheckboxMenuItem greenFillItem = new CheckboxMenuItem("Green Fill");
                CheckboxMenuItem blueFillItem = new CheckboxMenuItem("Blue Fill");
                CheckboxMenuItem purpleFillItem = new CheckboxMenuItem("Purple Fill");
                CheckboxMenuItem grayFillItem = new CheckboxMenuItem("Gray Fill");
            Menu sizeMenu = new Menu("Size");
                CheckboxMenuItem oneItem = new CheckboxMenuItem("One", true);
                CheckboxMenuItem twoItem = new CheckboxMenuItem("Two");
                CheckboxMenuItem threeItem = new CheckboxMenuItem("Three");
                CheckboxMenuItem fourItem = new CheckboxMenuItem("Four");
                CheckboxMenuItem fiveItem = new CheckboxMenuItem("Five");

    protected E3G04()
    {

        // Add everything to the menu bar and then
        // add the menu bar to the frame
        mb.add(fileMenu);
        mb.add(drawMenu);
        fileMenu.add(newItem);
        fileMenu.add(quitItem);
        drawMenu.add(typeMenu);
        drawMenu.add(fillMenu);
        drawMenu.add(colorMenu);
        drawMenu.add(sizeMenu);
        typeMenu.add(ovalItem);
        typeMenu.add(rectItem);
        typeMenu.add(lineItem);
        fillMenu.add(fillItem);
        fillMenu.add(noFillItem);
        if (fill && type != "line")
        {       
            enableAllColors();
        }
        else
        {
            disableFillColor();
        }
        sizeMenu.add(oneItem);
        sizeMenu.add(twoItem);
        sizeMenu.add(threeItem);
        sizeMenu.add(fourItem);
        sizeMenu.add(fiveItem);                 
        setMenuBar(mb); 

        //Set all of the listeners  
        newItem.addActionListener(this);
        quitItem.addActionListener(this);
        ovalItem.addItemListener(this);
        rectItem.addItemListener(this);
        lineItem.addItemListener(this);
        fillItem.addItemListener(this);
        noFillItem.addItemListener(this);
        blackLineItem.addItemListener(this);
        redLineItem.addItemListener(this);          
        orangeLineItem.addItemListener(this);
        yellowLineItem.addItemListener(this);
        greenLineItem.addItemListener(this);
        blueLineItem.addItemListener(this);
        purpleLineItem.addItemListener(this);
        grayLineItem.addItemListener(this);
        oneItem.addItemListener(this);
        twoItem.addItemListener(this);
        threeItem.addItemListener(this);
        fourItem.addItemListener(this);
        fiveItem.addItemListener(this);     

        drawingpanel = new Panel();
        drawingpanel.setLayout(null);
        drawingpanel.setSize(800,600);
        drawingpanel.addMouseListener(this);
        drawingpanel.addMouseMotionListener(this);
        setBounds(100,100,800,600);
        setLayout(new BorderLayout());

        add("Center",drawingpanel);
        addWindowListener(this);
        setResizable(true);
        pack();
        setVisible(true);
        thread.start();
    }

    public static void main(String [] args)
    {
        new E3G04();
    }
    public void run()
    {       
        obj = getGraphics();
        System.out.print("here");
        obj.setColor(Color.black);
        obj.drawRect(200,200,100,100);
        obj.fillRect(200,200,100,100);
        while(running)
        {           
            //other stuff to come
        }
    }

    public void stop()
    {
        drawingpanel.removeMouseListener(this);
        newItem.removeActionListener(this);
        quitItem.removeActionListener(this);
        ovalItem.removeItemListener(this);
        rectItem.removeItemListener(this);
        lineItem.removeItemListener(this);
        fillItem.removeItemListener(this);
        noFillItem.removeItemListener(this);
        blackLineItem.removeItemListener(this);
        redLineItem.removeItemListener(this);           
        orangeLineItem.removeItemListener(this);
        yellowLineItem.removeItemListener(this);
        greenLineItem.removeItemListener(this);
        blueLineItem.removeItemListener(this);
        purpleLineItem.removeItemListener(this);
        grayLineItem.removeItemListener(this);
        oneItem.removeItemListener(this);
        twoItem.removeItemListener(this);
        threeItem.removeItemListener(this);
        fourItem.removeItemListener(this);
        fiveItem.removeItemListener(this);  
        dispose();
        System.exit(0);
    }

    public void disableFillColor()
    {
        colorMenu.removeAll();
        colorMenu.add(blackLineItem);
        colorMenu.add(redLineItem);
        colorMenu.add(orangeLineItem);
        colorMenu.add(yellowLineItem);
        colorMenu.add(greenLineItem);
        colorMenu.add(blueLineItem);
        colorMenu.add(purpleLineItem);
        colorMenu.add(grayLineItem);
    }
    public void enableAllColors()
    {
        colorMenu.removeAll();
        colorMenu.add(blackLineItem);
        colorMenu.add(redLineItem);
        colorMenu.add(orangeLineItem);
        colorMenu.add(yellowLineItem);
        colorMenu.add(greenLineItem);
        colorMenu.add(blueLineItem);
        colorMenu.add(purpleLineItem);
        colorMenu.add(grayLineItem);        
        colorMenu.addSeparator();
        colorMenu.add(blackFillItem);
        colorMenu.add(redFillItem);
        colorMenu.add(orangeFillItem);
        colorMenu.add(yellowFillItem);
        colorMenu.add(greenFillItem);
        colorMenu.add(blueFillItem);
        colorMenu.add(purpleFillItem);
        colorMenu.add(grayFillItem);
    }
    public void actionPerformed(ActionEvent e)
    {
        Object o = e.getSource();

        if (o == newItem)
        {
            //Clear Screen
        }

        if (o == quitItem)
        {   
            thread.stop();
            running = false;
            stop();
        }
    }      

    public void mouseClicked(MouseEvent m)
    {
        Object o = m.getSource();
    }   

    public void mousePressed(MouseEvent m)
    {
        start = m.getPoint();
        end = start;
        cur = start;
    }

    public void mouseDragged(MouseEvent m)
    {
        cur = m.getPoint();
    }   

    public void mouseReleased(MouseEvent m)
    {
        end = cur;
    }   

    public void itemStateChanged(ItemEvent e)
    {
        //Code removed for brevity
    }
    public void windowClosing(WindowEvent e)
    {
        running = false;
        stop();
    }
    public void mouseExited(MouseEvent m)
    {}
    public void mouseEntered(MouseEvent m)
    {}  
    public void mouseMoved(MouseEvent m)
    { }
    public void windowClosed(WindowEvent e){}
    public void windowOpened(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeactivated(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
}

最佳答案

在 AWT 应用程序中,无论何时要绘制,通常都会创建 Canvas 的子类。覆盖 paint(Graphics)方法。参见 Java AWT Canvas – Freelance Drawing举个例子。

不幸的是,您当前的方法不起作用的原因非常复杂。所有绘图必须在 event dispatch thread 上完成(也称为 AWT 线程),例如。 AWT 为您创建这些特殊线程,并且在大多数情况下,您无需担心,除非创建您自己的线程。此外,正如 MadProgrammer 指出的那样,您不应该保留 Graphics 引用。在该方法的运行期间,您应该只使用 AWT 提供给您的 Graphics 引用。一个异常(exception)是从 BufferedImages 获得的 Graphics 引用(所谓的软件图形上下文)。

关于Java 图形绘图未显示在绘图面板上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793009/

相关文章:

java - jmf 应用程序出现 NoPlayerException 运行时错误

java - 将 weblogic 升级到 12.2.1.3.0,将 java 从 1.7 升级到 1.8 - 异常 WELD-001408 依赖项不满足

java - 如何从 xml 生成 Edifact 消息?

java - 绘图时如何防止屏幕闪烁?

macos - 如何记录 Mac OS X 显卡驱动程序

ios - 如何在 Metal 中组合使用不同着色器的渲染命令编码器

java 500错误: Oozie web console 4. 3

java - 保存 btmon 输出

Java 在一帧中绘制线条

java - 按下 JButton 时增加一个值