如何在没有类(扩展JFrame
)的情况下绘制对象?我找到了getgraphics
方法,但它不能绘制对象。
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(600, 400);
JPanel panel = new JPanel();
frame.add(panel);
Graphics g = panel.getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
}
如果希望更改组件的绘制方式(添加矩形),则需要在该组件中重新定义PaintComponent()
。在您的代码中,您使用的是getgraphics()
。
不应该在组件上调用getgraphics()
。您所做的任何绘制(对返回的图形
)都将是临时的,并且在下一次Swing确定需要重新绘制组件时将丢失。
相反,您应该重写PaintComponent(Graphics)
方法(JComponent
或JPanel
),并使用作为参数接收的Graphics
对象在此方法中进行绘制。
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(600, 400);
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
};
frame.add(panel);
// Graphics g = panel.getGraphics();
// g.setColor(Color.BLUE);
// g.fillRect(0, 0, 100, 100);
frame.validate(); // because you added panel after setVisible was called
frame.repaint(); // because you added panel after setVisible was called
}
}
另一个版本做了完全相同的事情,但对你来说可能更清楚:
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(600, 400);
JPanel panel = new MyRectangleJPanel(); // changed this line
frame.add(panel);
// Graphics g = panel.getGraphics();
// g.setColor(Color.BLUE);
// g.fillRect(0, 0, 100, 100);
frame.validate(); // because you added panel after setVisible was called
frame.repaint(); // because you added panel after setVisible was called
}
}
/* A JPanel that overrides the paintComponent() method and draws a rectangle */
class MyRectangleJPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
}
问题内容: 如何在没有类的情况下绘制对象(扩展了)?我找到了方法,但它没有绘制对象。 问题答案: 如果要更改组件的绘制方式(添加矩形),则需要在该组件中重新定义。在你的代码中,你正在使用 。 你不应该调用组件。你所做的任何绘画(退还给你的绘画)都是暂时的,并且在Swing下次确定需要重新绘画组件时将丢失。 相反,你应该覆盖或的)方法,并使用接收到的对象作为参数在此方法中进行绘制。 检查此链接以进一
问题内容: 将图片绘制到jframe时出现null异常错误。我调试代码并检查图像和框架是否不为null,但在将图像绘制到框架时仍然抛出NULL异常。 请看一看 : 问题答案: NPE可能来自这里: 根据文档: 为此组件创建图形上下文。如果此组件当前不可显示,则此方法将返回null。 1)不要将其用作坏习惯/不能持久使用,除非组件可见,否则它将返回。 2)相反,使用和覆盖不要忘记在覆盖中作为第一个呼
我可以使用此命令添加Jfram对象 然而,当我在一个单独的方法中编写这个时,我无法添加,因为“this”方法位于该对象内。 如何选择jframe而不是“this” 我不想创建新的jframe,因为已经有了
我想创建一个项目列表使用回收人员视图,并想展开特定项目时点击(如在电话呼叫列表)。我想实现这一点,而不使用任何库。有人能帮忙吗?
是否有可能在matplotlib中添加一个条目到图例中而不绘制相应的对象? 例如,我在一个图形上绘制了两组三条线。它们成对出现,所以我想用相应的颜色绘制它们,其中一个是虚线,另一个是实线。 但是,与图例中的所有六个项目不同,(纯蓝色1、纯橙色2、纯绿色3、纯蓝色1、纯橙色2、纯绿色3),我希望有三个项目(纯蓝色1、纯橙色2、纯绿色3),然后有两个额外的项目来消除虚线与实线之间的歧义(纯黑色“正片”
问题内容: 我是一个狂热的程序员,但是今天是我的第一堂Java课。 使用上面的代码,我想在窗口上写一个句子,但是它永远不会写。我究竟做错了什么? 编辑:没关系-油漆一定是油漆。我深表歉意。 问题答案: 在给定的代码中,您想要的是 一个工作示例供您参考: