2013-07-14 62 views
1

当我运行这个程序时,我看到的只是一个空白的JFrame。我不知道为什么paintComponent方法不起作用。这里是我的代码:为什么我不能绘制到我的JPanel?

package com.drawing; 

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyPaint extends JPanel { 

    private void go() { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.YELLOW); 
     g.fillRect(50, 50, 100, 100); 
    } 

    public static void main(String[] args) { 
     My paintTester = new MyPaint(); 
     paintTester.go(); 
    } 
} 
+0

使用'this',而不是''中去(panel')' – chaosmasttter

+1

另外,为什么没有JFrame的方法和JPanel有两个不同的类? –

+0

只是一个建议,而不是在'JFrame'上设置大小,如果您重写[__getPreferredSize()__](http://docs.oracle.com/javase/7/docs/api/javax/swing /JComponent.html#getPreferredSize()),就像重写'paintComponent()'方法并调用'frame.pack()' –

回答

4

你必须要做到这一点

private void go() { 
     JFrame frame = new JFrame(); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.add(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

,但我会重构你的等级和独立responsabilities ..

go()不应该在这个类

public class MyPaint extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.YELLOW); 
     g.fillRect(50, 50, 100, 100); 
    } 

} 

而在另一声明

// In another class 
public static void main(String[] args) { 
    JPanel paintTester = new MyPaint(); 
    JFrame frame = new JFrame(); 
    frame.setSize(400, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.add(paintTester); 
    frame.pack(); 
    frame.setVisible(true); 
} 

或者,如果你只是要使用此面板在一个网站,你可以采取匿名类

 JFrame frame = new JFrame(); 
    frame.add(new JPanel(){ 
     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.YELLOW); 
      g.fillRect(50, 50, 100, 100); 
     } 

    }); 
+0

工作!谢谢!但是在这种情况下究竟是指“这个”呢?它是指JPanel,我之前提出了一个新对象吗?我的班级结构有什么问题?对不起,当谈到以一种很好的面向对象的方式来设计程序时,我有些不自在。 –

+0

@BillyJean我编辑我的答案,希望它可以帮助..'this'指的是'你这种类的'这个类的实例你创建的类 – nachokk

+0

噢好吧,陷阱。谢啦! –

2

您要添加一个普通JPanelJFrame不包含您的自定义油漆逻辑。删除

JPanel panel = new JPanel(); 

,并添加

frame.add(this); 

而且更好地保持2类:一类主要和定制JPanel油漆逻辑separation of concerns

+1

我真的认为,他可以添加'这个' – nachokk

+0

这两个建议的工作!非常感谢!!但是我究竟做错了什么?香草是否意味着它是一个原始的JPanel? –

+0

您正在添加一个不实现自定义绘画逻辑的组件(如前所述)。顺便说一句:_vanilla_意味着[平原](http://www.thefreedictionary.com/plain+vanilla),在这种情况下,没有实现自定义绘画。 – Reimeus

相关问题