2015-04-29 54 views
1

好吧,我正在试图使用摆动来制作一个程序,在该程序中,我必须能够在屏幕的右下角绘制一个椭圆形和矩形。我目前正在尝试使用之前的程序,其中程序使用JToggleSwitch开始和停止一个正方形。我的问题是我怎样才能得到一个形状来开关屏幕,因为它需要一个参数“图形g”。这是我的PaintPanel代码。如何在Java Swing中切换屏幕上和屏幕外的形状?

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

public class PaintPanel extends JPanel 
{ 
    private static Color[] colors = 
     { Color.RED, Color.BLACK, Color.PINK, Color.ORANGE }; 
    private int colorNumber = 0; 

    private int shape = 0; 

    private int x = 0; 
    private int y = 0; 

    private int width = 100; 
    private int height = 100; 

    private int dx = 2; 
    private int dy = 2; 

    private String displayString = "hello"; 

    private boolean isStarted = true; 

    public void update() 
    { 
     if (isStarted) 
     { 
      x += dx; 
      y += dy; 
     } 
     //dx ++; 
     //dy ++; 

     if (y + height > getHeight()) 
     { 
      dy = -Math.abs(dy); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 
     else if (y < 0) 
     { 
      dy = Math.abs(dy); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 

     if (x + width > getWidth()) 
     { 
      dx = -Math.abs(dx); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 
     else if (x < 0) 
     { 
      dx = Math.abs(dx); 
      shape++; 
      colorNumber = (colorNumber+1)%colors.length; 
     } 

    } 

    public void changeColor() 
    { 
     colorNumber = (colorNumber+1) % colors.length; 
    } 

    public void startStop() 
    { 
     //if (isStarted == true) isStarted = false; 
     //else isStarted = true; 

     isStarted = !isStarted; 
    } 

    public void setDisplayText(String dt) 
    { 
     displayString = dt; 
    } 
    public void paintRectangle(Graphics g) 
    { 

     int w = getWidth(); 
     int h = getHeight(); 
     g.setColor(Color.PINK); 
     g.fillRect(w/2, h/2, w/2, h/2); 
     //g.setColor(Color.CYAN); 
     //g.fillOval((5*w)/8, (5*h)/8, w/4, h/4); 


    } 


    public void paintComponent(Graphics g) 
    { 



     int w = getWidth(); 
     int h = getHeight(); 
     g.setColor(colors[colorNumber]); 
     if (shape % 2 == 0) //g.fillOval(x, y, width, height); 
     /*else*/ g.fillRect(x,y, width, height); 


     int textx = x+width/2; 
     int texty = y+height/2; 

     FontMetrics fm = g.getFontMetrics(); 
     int texth = fm.getHeight(); 
     int textw = fm.stringWidth(displayString); 

     textx -= textw/2; 
     texty += texth/2; 
     texty -= 5;  

     g.setColor(colors[(colorNumber+1)%colors.length]); 
     g.drawString(displayString, textx, texty); 
    } 

} 

这里是创建窗口和面板的实际代码。这是我的主要课程。

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

public class GuiTest extends JFrame 
    implements ActionListener 
{ 
    private Timer frameTimer; 
    private JToggleButton name; 
    private JToggleButton ovalButton; 
    private JToggleButton rectangle; 
    //private JTextField theText; 
    private PaintPanel paintPanel; 

    public GuiTest() 
    { 
     setTitle("Servando Hernandez"); 
     setSize(500,500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel topPanel = new JPanel(); 
     topPanel.setLayout(new GridLayout(1,3)); 

     name = new JToggleButton("Name"); 
     name.addActionListener(this); 

     ovalButton = new JToggleButton("Oval"); 
     ovalButton.addActionListener(this); 

     rectangle = new JToggleButton("Rectangle"); 
     rectangle.addActionListener(this); 

     //theText = new JTextField("HI"); 
     //theText.addActionListener(this); 


     topPanel.add(name); 
     topPanel.add(ovalButton); 
     topPanel.add(rectangle); 
     //topPanel.add(theText); 

     Container contentPane = getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(topPanel, BorderLayout.SOUTH); 

     paintPanel = new PaintPanel(); 
     contentPane.add(paintPanel, BorderLayout.CENTER); 

     frameTimer = new Timer(50, this); 
     frameTimer.start(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     //System.out.println("Action performed"); 
     if (e.getSource() == name)  
     { 
      paintPanel.changeColor(); 
     } 
     else if (e.getSource() == frameTimer) 
     { 
      paintPanel.update(); 
     } 
     else if (e.getSource() == ovalButton) 
     { 
      //System.out.println("start/stop"); 
      paintPanel.startStop(); 
     } 
     else if (e.getSource() == rectangle) 
     { 

     } 
     /*else if (e.getSource() == theText) 
     { 
      String text = e.getActionCommand(); 
      paintPanel.setDisplayText(text); 
      //System.out.println(text); 
     } 
     */ 
     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     GuiTest gui = new GuiTest(); 
     gui.setVisible(true); 

    } 
} 
+0

您可以维护要绘制的“Shape”列表并根据需要添加/删除它们。您可以维护一系列标志,指示要绘制哪些形状 – MadProgrammer

+0

在进行任何自定义绘画之前,您还应该调用'super.paintComponent' – MadProgrammer

回答

1

你可以...

保持ShapeList A S将被涂,需要添加或删除它们。你会然后依次通过在paintComponent方法列表,画什么都是在List和简单的调用repaint当你想组件更新

你可以...

有一系列的boolean(或其他)标志的类型,其决定要绘制哪种形状。这种修复是什么形状都可以被涂并没有真正允许您控制形状

你应该的Z顺序的...

被调用super.paintComponent你做任何自定义涂装前,否则每次组件涂漆时都可能会产生不需要的油漆痕迹。请记住,绘画具有破坏性,当调用paintComponent时,应该完全重新绘制组件的当前状态。