Java 我不知道我';我在做——油漆方法等
我一直在努力使用绘制方法、绘制组件和扩展JFrame,并一直在尝试各种方法来绘制一个简单的矩形。下面是一个名为Window的类: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() {
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();
}
}
}