2014-05-21 45 views
-1

多邊形怎麼告訴我的程序要顯示。這是我所調用的課程的代碼。Java Gridbag佈局fillPolygon不顯示?

package rubiksCube; 
/*class that contains my paint component*/ 
import java.awt.*; 
import javax.swing.JPanel; 
public class Display extends JPanel{ 
    Polygon[][] p = {{new Polygon(),new Polygon(),new Polygon()}, 
        {new Polygon(),new Polygon(),new Polygon()}, 
        {new Polygon(),new Polygon(),new Polygon()}}; 
    int[] rx = {0,0,0,0}; 
    int[] ry = {0,0,0,0}; 
    int rsN = 0; 
    public void renderSide(int sN,int[] x,int[] y){ 
     rsN = sN; 
     ry = y; 
     rx = x; 
    } 
    public void paintComponent(Graphics g){ 
     g.clearRect(0, 0, 100, 100); 
     for(int y = 0;y<3;y++){ 
      for(int x = 0;x<3;x++){ 
       System.out.print(x); 
       System.out.println(y); 
       g.setColor(getColor(Main.j[rsN][(y*3)+x])); 
       p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y/3)+((ry[0]-ry[3])*(x/3)+ry[0])); 
       p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x+1/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1])*(y/3))+((ry[0]-ry[3])*(x/3)+ry[0])); 
       p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x+1/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y+1/3)+((ry[0]-ry[3])*(x/3)+ry[0])); 
       p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y+1/3)+((ry[0]-ry[3])*(x/3)+ry[0])); 
       g.fillPolygon(p[y][x]); 
      } 
     } 
    } 
    public Color getColor(int i){ 
     switch(i){ 
      case 0: 
      return Color.WHITE; 
      case 1: 
      return Color.GREEN; 
      case 2: 
      return Color.RED; 
      case 3: 
      return Color.YELLOW; 
      case 4: 
      return Color.BLUE; 

     } 
     return Color.ORANGE; 
    } 
} 
//my main class 
package rubiksCube; 

import java.awt.Graphics; 

import javax.swing.JFrame; 

public class Main { 

    public static int[][] j = { 
      {0,0,0,0,0,0,0,0,0}, 
      {1,1,1,1,1,1,1,1,1}, 
      {2,2,2,2,2,2,2,2,2}, 
      {3,3,3,3,3,3,3,3,3}, 
      {4,4,4,4,4,4,4,4,4}, 
      {5,5,5,5,5,5,5,5,5} 
    }; 
    public static void main(String args[]){ 
      SimpleGui s = new SimpleGui(); 
      Display d = new Display(); 
      int[] x = {0,100,100,0}; 
      int[] y = {0,0,100,100}; 
      d.renderSide(0,x,y); 
      s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      s.pack(); 
      s.setSize(1000,700); 
      s.setVisible(true); 
      s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      s.pack(); 
      s.setSize(1000,1000); 
      s.setVisible(true); 

    } 

} 
    //and my gui class 
package rubiksCube; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 


public class SimpleGui extends JFrame{ 
     int[] px2; 
     int[] py2; 
     int[] pz2; 
     Graphics g2 = null; 
     int sN; 


    public SimpleGui(){ 
     JButton solve = new JButton(); 
     JPanel p = new JPanel(); 
     solve.setText("Solve"); 
     solve.addActionListener(new ActionListener(){ 

     public void actionPerformed(ActionEvent e){ 
      Control c = new Control(); 
      c.solve(); 
     }}); 
     solve.addKeyListener(new KeyListener(){ 


      public void keyPressed(KeyEvent k) { 
       switch (k.getKeyCode()){ 
       case KeyEvent.VK_DOWN: 

        break; 
       case KeyEvent.VK_UP: 

        break; 
       case KeyEvent.VK_LEFT: 

        break; 
       case KeyEvent.VK_RIGHT: 

        break; 
       case KeyEvent.VK_0: 

        break; 
       case KeyEvent.VK_1: 

        break; 
       case KeyEvent.VK_2: 

        break; 
       case KeyEvent.VK_3: 

        break; 
       case KeyEvent.VK_4: 

        break; 
       case KeyEvent.VK_5: 

        break; 
       case KeyEvent.VK_6: 

        break; 
       case KeyEvent.VK_7: 

        break; 
       case KeyEvent.VK_8: 

        break; 
       case KeyEvent.VK_9: 

        break; 
       case KeyEvent.VK_MINUS: 

        break; 
       case KeyEvent.VK_EQUALS: 

        break; 

       } 


      } 


      public void keyReleased(KeyEvent k) { 


      } 


      public void keyTyped(KeyEvent k) { 


      } 

     }); 
     JButton random = new JButton(); 
     random.setText("Randomize"); 
     random.addActionListener(new ActionListener(){ 

     public void actionPerformed(ActionEvent e){ 
      Control c = new Control(); 
      c.random(); 
     }}); 
     p.setVisible(true); 
     p.setLayout(new GridBagLayout()); 
     solve.setVisible(true); 
     random.setVisible(true); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.weightx = 1; 
     c.weighty = 1; 
     c.gridx = 0; 
     c.gridy = 0; 
     c.anchor = GridBagConstraints.FIRST_LINE_START; 
     p.add(solve,c); 
     c.anchor = GridBagConstraints.PAGE_START; 
     c.gridx = 0; 
     c.gridy = 0; 
     p.add(random,c); 
     c.anchor = GridBagConstraints.FIRST_LINE_START; 
     c.gridx = 2; 
     c.gridy = 2; 
     JPanel d = new Display(); 
     d.setPreferredSize(new Dimension(100,100)); 
     p.add(d,c); 
     add(p); 
     setContentPane(p); 
     setVisible(true); 
    }} 

有人可以解釋說,當我說g.fillPolyon(p [y] [x]);它不起作用? 請幫助,謝謝。 這是我的顯示類的第23行。

回答

2
  1. 不調用super.paintComponent會造成潛在的問題
  2. 沒有提供一個尺寸暗示爲Display可以有它呈現爲0x0
  3. 位置時畫的圖形上下文的組件被塗,也就是0x0的x/y位置是組件的左上角,指定可能超出組件大小的X/Y位置將不會被繪製

以下.. 。

public static void main(String args[]) { 
    SimpleGui s = new SimpleGui(); 
    Display d = new Display(); 
    int[] x = {0, 100, 100, 0}; 
    int[] y = {0, 0, 100, 100}; 
    d.renderSide(0, x, y); 
    s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    s.setSize(1000, 700); 
    s.setVisible(true); 
} 

是怎麼樣的迴音,因爲d實際上不添加任何東西的可能使其

更新

您需要進一步調試代碼...

我添加了一些System.out.println聲明以查看您正在創建的內容,並且這是輸出...

---nxn是主要的for-loops。每個系列之後的數字是Polygon

---0x0 
0x0 
0x0 
0x0 
0x0 
---1x0 
0x0 
100x0 
100x0 
0x0 
---2x0 
0x0 
200x0 
200x0 
0x0 
---0x1 
0x0 
0x0 
0x0 
0x0 
---1x1 
0x0 
100x0 
100x0 
0x0 
---2x1 
0x0 
200x0 
200x0 
0x0 
---0x2 
0x0 
0x0 
0x0 
0x0 
---1x2 
0x0 
100x0 
100x0 
0x0 
---2x2 
0x0 
200x0 
200x0 
0x0 
---0x0 
0x0 
0x0 
0x0 
0x0 
---1x0 
0x0 
100x0 
100x0 
0x0 
---2x0 
0x0 
200x0 
200x0 
0x0 
---0x1 
0x0 
0x0 
0x0 
0x0 
---1x1 
0x0 
100x0 
100x0 
0x0 
---2x1 
0x0 
200x0 
200x0 
0x0 
---0x2 
0x0 
0x0 
0x0 
0x0 
---1x2 
0x0 
100x0 
100x0 
0x0 
---2x2 
0x0 
200x0 
200x0 
0x0 

如果你仔細觀察,你會發現你是畫直線(或空的多邊形)。

你也已經聲明,並在Display使用p的方式是值得關注的,因爲你永遠不重置Polygon S,含義,每一個新的重繪,你只需添加多個點到多邊形。更好地預先caclaulte這個,只是畫結果 - 恕我直言

+0

對不起,我無法回答,但謝謝你的所有建議。我現在看到你對空的多邊形是正確的。現在解決這個問題。 – colorado777

+0

另外一個問題,似乎rx [1]在渲染端以外的任何其他類中調用時總是等於0。爲什麼是這樣? – colorado777

+0

不知道,得到了一個演示問題的可運行示例... – MadProgrammer