Java 我不知道我';我在做——油漆方法等

Java 我不知道我';我在做——油漆方法等,java,swing,paint,Java,Swing,Paint,我一直在努力使用绘制方法、绘制组件和扩展JFrame,并一直在尝试各种方法来绘制一个简单的矩形。下面是一个名为Window的类: import javax.swing.*; import java.awt.Graphics; public class Window extends JFrame { /** * */ private static final long serialVersionUID = 1L; Window() {

我一直在努力使用绘制方法、绘制组件和扩展JFrame,并一直在尝试各种方法来绘制一个简单的矩形。下面是一个名为Window的类:

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

public class Window extends JFrame 
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    Window()
    {
        setSize(300,300);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public void paint(Graphics g)
    {
        g.drawRect(300,300,300,300);
    }
}
然后是班长

public class Main {

        public static void main(String args[])
        {
            Window mainWindow = new Window();
            mainWindow.setBounds(100,100,300,300);
        }
}

这个程序的唯一目的就是画一个该死的矩形。我不知道我可能做错了什么,我已经尝试了好几天了,都没有用。我也试过使用面板。

你能试试这个代码吗

导入java.awt.Graphics;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类Main扩展了JPanel{
公共静态void main(字符串[]a){
JFrame f=新的JFrame();
f、 设置大小(400400);
f、 添加(新的Main());
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
公共空间涂料(图g){
g、 fillRect(5,15,50,75);
}

}
不要覆盖顶级容器(如
JFrame
)的
paint
,这是最快的方法,最终会产生奇怪和意外的结果

在框架的实际表面和使用之间,有一个
JRootPane
、一个
contentPane
,可能还有一个
glassPane

所有这些都可以连接/擦除您在
paint
方法中绘制的内容

相反,从一个
JPanel
开始,覆盖它的
paintComponent
。创建此的实例,并在需要显示时将其放置在
JFrame
的实例上

查看和了解更多详细信息

另外,请注意,在绘制时,
0x0
是组件的左上方,因此在您的示例中,您从
300x300
开始绘制,但您的帧只有
300x300
,因此您实际上是在绘制屏幕

例如:


1.您应该避免重写
paint
,这是一条一般的经验法则,在Swing中,我们鼓励您重写
paintComponent
,这是有很多原因的,但它只是解决了很多问题;2.你已经打破了油漆链,这将导致一些非常奇怪的绘画作品;3.您应该在事件调度线程的上下文中初始化UI,有关详细信息,请参阅。另外,您的代码不是JavaScript,因此不应该使用代码段upmarking:Pthanks。我更改了窗口以扩展JPanel和maid油漆组件。您能否解释一下使用paintComponent而不是paint的含义?还有,是否有过像我最初那样扩展JFrame的情况?有没有一种方法可以在不扩展JPanel或JFrame的情况下进行绘制?\n不,不是真的,说真的,它不会为您提供通过其他更好的方法无法实现的任何优势基本上,当您的组件需要绘制时,它会调用
paint
方法,然后调用
paint
方法进行委托(一些)工作到
paintComponent
paintBorder
paintChildren
。由于paint API的工作方式,子组件也可以独立于其父容器进行绘制,这可能会产生一些非常奇怪的问题。因此,一般的经验法则是,不要覆盖
paint
:PRight,那么如果有人不扩展JFrame或JPanel,该怎么做呢?因为要调用paintComponent方法,必须提供图形对象。我还没有看到在main(string[]args)中定义图形对象的可能性“对,那么在没有扩展JFrame或JPanel的情况下该怎么做?”-你没有。“我看不到在main(string[]args)中定义图形对象的可能性”-您不能,或者至少不能在屏幕上单独呈现一个图形对象。您必须至少有一个显示的组件(连接到本机对等设备的组件),该组件将生成
图形
上下文本身并设置绘制过程。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestPaint {

    public static void main(String[] args) {
        new TestPaint();
    }

    public TestPaint() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        public PaintPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.drawRect(10, 10, getWidth() - 20, getHeight() - 20);
            g2d.dispose();
        }

    }

}