2015-04-29 74 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時,應該完全重新繪製組件的當前狀態。