2013-04-06 93 views
0

我试图在指定的位置显示一个矩形,但它没有显示出来。背景是洋红色,但矩形不在那里。Java不显示矩形?

另外:我怎样才能获得更多的颜色除了

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


class Screensaver { 
    private final static int FRAME_HEIGHT = 600; 
    private final static int FRAME_WIDTH = 600; 
    public static void main(String[] args){ 
     JFrame win; 
     Container contentPane; 
     Graphics g; 


     win = new JFrame(); 
     win.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     win.setVisible(true); 
     contentPane = win.getContentPane(); 
     contentPane.setBackground(Color.MAGENTA); 
     g = contentPane.getGraphics(); 
     g.setColor(Color.BLACK); 
     g.fillRect(80, 350, 400, 250); 

    } 
} 
+0

'g = contentPane.getGraphics();'千万不要这样做,而是在绘画请求时绘制。 – 2013-04-06 23:15:42

回答

3

你不应该主要是画();“颜色(插入选项非常少在这里)。”最好是扩展JPanel,更改paintComponent(),并将面板添加到JFrame中。

public class PaintPanel extends JPanel { 

    public PaintPanel() { 
     setBackground(Color.MAGENTA); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); // This paints the background 

     g.setColor(Color.BLACK); 
     g.fillRect(80, 350, 400, 250); 
    } 
} 

而且在main():

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.add(new PaintPanel()); 
    frame.setVisible(true); 
} 

如果你想使自己的颜色,你可以使用新的颜色(红INT,INT绿,蓝INT)构造函数。

+0

没想到我想出来了 – 2013-04-06 20:17:08

0

试试这个:

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

class Screensaver { 

    private final static int FRAME_HEIGHT = 600; 
    private final static int FRAME_WIDTH = 600; 

    public static void main(String[] args) { 
     JFrame win; 
     Container contentPane; 
     win = new JFrame(); 
     win.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     win.setVisible(true); 
     Component comp = new Component(); 
     contentPane = (Container) win.getContentPane().add(comp); 


    } 
    } 

    class Component extends JComponent { 

    @Override 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
     g.setColor(Color.magenta); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.BLACK); 
     g.fillRect(80, 350, 400, 250); 
    } 
} 

和有关的颜色,你面包车创建新的颜色,当你想设置的红,绿,蓝,试试这个:

g.setColor(new Color(red, green, blue)); 
+1

执行自定义绘画的推荐方法是paintComponent。你也应该调用super.paint/pantComponent – MadProgrammer 2013-04-06 20:34:55

+0

我不知道'paint'方法有什么问题?我运行它并且没问题,所以请告诉我错误在哪里? – 2013-04-06 20:48:11

+0

http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/DrawRectangle.htm:java教程 – 2013-04-06 20:51:04

-1

的绘制矩形曾经,但每次调用JFrames repaint()方法时,都会将其擦除并绘制基本组件。要在JFrame中添加自定义绘图,您必须重写绘制方法。在这里,我稍微改进了一下你的代码,让你开始沿着这条路走下去正如你所看到的,你想在Paint方法中绘制这个盒子。我制作了一个Container元素,用于绘制图形并移除背景颜色,并将其添加到绘制方法中。

试试这个

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

public class JavaApplication10 { 
    private final static int FRAME_HEIGHT = 600; 
    private final static int FRAME_WIDTH = 600; 
    public static void main(String[] args){ 
     JFrame win = new JFrame(); 
     win.setContentPane(new MyBoxContainer()); 
     win.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     win.setVisible(true); 
    } 

    private static class MyBoxContainer extends Container { 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.MAGENTA); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
      g.setColor(Color.BLACK); 
      g.fillRect(80, 350, 400, 250); 
     } 
    } 
} 
+0

1-当OP使用Swing时想从AWT组件中扩展2-自定义绘画的推荐方法是JComponent#paintComponent – MadProgrammer 2013-04-06 20:32:16

0

如果你想画的东西创建从一个Swing容器,JComponent的,JPanel的,等继承一个类并重写油漆(图形G)的方法。如果您看到品红色背景,则必须添加contentPane。可能发生的事情是它的画在你矩形上的洋红色背景,但这只是一个猜测。试试这个...

public class ContentPane extends JComponent { 
    public ContentPane() { 

    } 

    @Override 
    public void paint(Graphics g) { 
      g.setColor(Color.MAGENTA); 
      g.fillRect(0, 0, getWidth(), getHeight()); 

      g.setColor(Color.BLACK); 
      g.fillRect(80, 350, 400, 250); 

    } 
} 

然后在你的主类实例的contentPane类的一个对象,并把它添加到你的JFrame。重绘repaint()的调用可能是不必要的,但这将确保它被绘制。你也可以尝试使用paintComponent(Graphics g)方法,两者之间有区别,我相信它是从update方法调用的顺序,但我可能错了,但是这应该解决你的问题问题。

至于颜色,请查阅API。您可以将RGB值传递给Color构造函数以创建各种颜色。颜色颜色=新颜色(int红色,int绿色,int蓝色)。我认为这是创建自定义颜色的最简单方法,但就像我在API中说的那样。希望这可以帮助。

+1

推荐方法执行自定义绘画将是paintComponent。你应该打电话super.paint,你永远不应该在任何绘画方法中调用repaint EVER – MadProgrammer 2013-04-06 20:33:41

+0

正确,我只是把它扔在那里,以确保一切都被绘制,但你是正确的,它应该从另一个线程调用。我现在编辑它。 – 2013-04-06 20:44:46

+0

应在EDT上下文中调用repaint,而不是在任何绘制方法中调用 – MadProgrammer 2013-04-06 20:52:49