Java 把一个圆画成一个框架
我试图在一个灰色的正方形框架中画一个小圆圈,作为RC遥控器斗杆位置的指示器 我有两门课:Java 把一个圆画成一个框架,java,swing,graphics,nullpointerexception,jframe,Java,Swing,Graphics,Nullpointerexception,Jframe,我试图在一个灰色的正方形框架中画一个小圆圈,作为RC遥控器斗杆位置的指示器 我有两门课: public class GUI2 extends JFrame { private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void
public class GUI2 extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI2 frame = new GUI2();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public GUI2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
StickWidget Left = new StickWidget();
Left.setName("Left Stick");
Left.drawCircle(10, 10);
contentPane.add(Left.draw(), BorderLayout.EAST);
StickWidget Right = new StickWidget();
Right.setName("Right Stick");
contentPane.add(Right.draw(), BorderLayout.WEST);
}
}
我还有第二节课:
public class StickWidget extends JPanel {
private javax.swing.JPanel panel_1;
private String NameOfStick;
private int xpos;
private int ypos;
public void initcomponents()
{
panel_1 = new javax.swing.JPanel();
}
public StickWidget() {
//do nothing?
}
public Component draw()
{
initcomponents();
JPanel main = new JPanel();
main.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
Dimension D1 = new Dimension(120, 150);
main.setMinimumSize(D1);
main.setMaximumSize(D1);
main.setPreferredSize(D1);
main.setSize(D1);
main.setLayout(new MigLayout("", "[grow]", "[grow][grow]"));
JPanel panel = new JPanel();
main.add(panel, "cell 0 0,grow");
JLabel StickName = new JLabel(NameOfStick);
panel.add(StickName);
panel_1.setBackground(Color.LIGHT_GRAY);
Dimension d = new Dimension(100, 100);
panel_1.setMinimumSize(d);
panel_1.setMaximumSize(d);
main.add(panel_1, "cell 0 1,grow");
return main;
}
public void drawCircle(int x, int y)
{
Graphics2D g2d = (Graphics2D)panel_1.getGraphics();
g2d.fillOval(x, y, 10, 10);
}
public void setName(String s)
{
NameOfStick = s;
}
}
当前程序可以很好地绘制GUI,但是当我尝试运行drawCircle()时,它会崩溃并产生错误。我不确定我做错了什么,我没有很多二维绘图的经验
所以我的问题是:
-这是正确的方法吗?
-如何让drawCircle在灰色框架内绘制圆
错误消息:
java.lang.NullPointerException
at experiments.StickWidget.drawCircle(StickWidget.java:59)
at experiments.GUI2.<init>(GUI2.java:44)
at experiments.GUI2$1.run(GUI2.java:23)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745)
at java.awt.EventQueue.access$300(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:706)
at java.awt.EventQueue$3.run(EventQueue.java:704)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:715)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
java.lang.NullPointerException
在experiments.StickWidget.drawCircle(StickWidget.java:59)
位于experiments.GUI2.(GUI2.java:44)
在experiments.GUI2$1.run(GUI2.java:23)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)中
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745)
在java.awt.EventQueue.access$300(EventQueue.java:103)
在java.awt.EventQueue$3.run(EventQueue.java:706)
在java.awt.EventQueue$3.run(EventQueue.java:704)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:715)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
在java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:161)
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:150)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
在java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
通过覆盖paint/paintComponent绘制一个圆(如果使用swing)
要绘制自定义圆,可以先使用(缓冲)图像进行绘制
public class DrawCircles extends JPanel {
Image im = new BufferedImage(...);
public void drawCircle(int x, int y) {
im.getGraphics().drawOval(x,y,50,50); //TODO: should really dispose the Graphics object after drawing the oval
repaint();
}
public void paintComponent(Graphics g) {
g.drawImage(im,0,0,null);
}
}
要调试问题,请尝试放置代码:
public void drawCircle(int x, int y)
{
if(panel_1==null){
System.err.println("Panel is null");
return;
}
Graphics2D g2d = (Graphics2D)panel_1.getGraphics();
if(g2d==null){
System.err.println("Graphics is null");
return;
}
g2d.fillOval(x, y, 10, 10);
}
我会使用画布而不是JPanel在上面绘制图形。你能包括错误吗?@maskacovnik Ive添加了它
public void drawCircle(int x, int y)
{
if(panel_1==null){
System.err.println("Panel is null");
return;
}
Graphics2D g2d = (Graphics2D)panel_1.getGraphics();
if(g2d==null){
System.err.println("Graphics is null");
return;
}
g2d.fillOval(x, y, 10, 10);
}