2015-12-02 71 views
1

的多個圖形對象我有一個繪製跳棋板的任務。這裏是我的框架類來自方法

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JTabbedPane; 

public class AppFrame extends JFrame { 
    public AppFrame() { 
     setTitle("Kółko i kwadracik"); 
     setSize(1000, 1500); 
     setLocationRelativeTo(null); 
     initGUI(); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void initGUI() { 
     setLayout(new BorderLayout()); 

     JTabbedPane tabPane = new JTabbedPane(); 
     tabPane.addTab("Plansza", new PlanszaGry()); 
     tabPane.addTab("Obrazek", new PanelZObrazkiem()); 
     tabPane.addTab("Wykres", new Wykres()); 
     tabPane.addTab("Warcaby", new Warcaby()); 
     tabPane.addTab("4 Warcaby", new Warcaby4()); 

     add(tabPane, BorderLayout.CENTER); 
    } 
} 

比一個類來創建一個跳棋板,它是一個新的Warcaby()

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Stroke; 
import java.awt.geom.Line2D; 

import javax.swing.JPanel; 

public class Warcaby extends JPanel { 
    public void paint(Graphics g) { 
     super.paint(g); 

     setBackground(Color.WHITE); 

     Graphics2D g2 = (Graphics2D) g; 

     Stroke defaultStroke = g2.getStroke(); 

     int y = 9; // tu ustawiamy liczbę linii (czyli w sumie wilekość planszy) 

     // linie planszy do gry 
     for (int i = 0; i <= y; i++) { 
      float dash[] = { 10.0f }; 
      Stroke lineStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, 
        BasicStroke.JOIN_MITER); 
      g2.setStroke(lineStroke); 
      g2.setColor(Color.BLACK); 
      int x = i * 100; 
      g2.draw(new Line2D.Double(100 + x, 100, 100 + x, 100 * y));// linie 
                     // pionowe 

      g2.draw(new Line2D.Double(100, 100 + x, 100 * y, 100 + x)); // linie 
                     // poziome 

     } 

     // Plansza do gry (czarne/białe pola) 
     for (int a = 1; a < y; a++) { 
      if (a % 2 != 0) { 
       for (int b = 1; b < y; b++) { 
        if (b % 2 == 0) { 

         g.setColor(Color.black); 
         g.fillRect(b * 100, a * 100, 100, 100); 
        } 
       } 
      } else { 
       for (int b = 1; b < y; b++) { 
        if (b % 2 != 0) { 

         g.setColor(Color.black); 
         g.fillRect(b * 100, a * 100, 100, 100); 
        } 
       } 
      } 

     } 
    } 
} 

我的下一個任務是繪製旁邊的海誓山盟4塊板,老師給我提示創建繪製一塊板的方法,並提供關於其位置的信息。我無法弄清楚如何開始。我已經開始與此:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Stroke; 
import java.awt.geom.Line2D; 

import javax.swing.JPanel; 

public class Warcaby4 extends JPanel { 

    public void Warcaby(Graphics g, int x, int y) { 
     super.paint(g); 
     setBackground(Color.WHITE); 
     Graphics2D g2 = (Graphics2D) g; 
     Stroke defaultStroke = g2.getStroke(); 
     float dash[] = { 10.0f }; 
     Stroke lineStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, 
       BasicStroke.JOIN_MITER); 
     g2.setStroke(lineStroke); 
     g2.setColor(Color.BLACK); 

     for (int i = 0; i <= y; i++) { 

      x = i * 100; 
      g2.draw(new Line2D.Double(100 + x, 100, 100 + x, 100 * y));// linie 
                     // pionowe 

      g2.draw(new Line2D.Double(100, 100 + x, 100 * y, 100 + y)); // linie 
                     // poziome 

     } 

     // Plansza do gry (czarne/białe pola) 
     for (int a = 1; a < y; a++) { 
      if (a % 2 != 0) { 
       for (int b = 1; b < y; b++) { 
        if (b % 2 == 0) { 

         g.setColor(Color.black); 
         g.fillRect(b * 100, a * 100, 100, 100); 
        } 
       } 
      } else { 
       for (int b = 1; b < y; b++) { 
        if (b % 2 != 0) { 

         g.setColor(Color.black); 
         g.fillRect(b * 100, a * 100, 100, 100); 
        } 
       } 
      } 

     } 
    } 
} 

現在我不知道在哪裏以及如何叫出它的4倍,我連我這樣做對嗎?請給我一些建議。 :)

+1

TL; DR。考慮將其移至代碼審閱堆棧交換。 –

+0

@MadPhysicist _。我無法弄清楚如何甚至開始_ < - 代碼必須已經寫入 – Caridorc

+0

下一句:*我已經開始這個* –

回答

1

我的下一個任務是繪製旁邊的海誓山盟4塊板,老師給了我一個提示,創建方法繪製一個板與有關它的位置。我無法弄清楚如何開始。我已經從這開始:

爲什麼不重新使用已有的組件?例如,使用GridLayout你可以只因爲你需要創建儘可能多的成分......

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class AppFrame { 

    public static void main(String[] args) { 
     new AppFrame(); 
    } 

    public AppFrame() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridLayout(2, 2)); 
       frame.add(new Warcaby()); 
       frame.add(new Warcaby()); 
       frame.add(new Warcaby()); 
       frame.add(new Warcaby()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Warcaby extends JPanel { 

     public Warcaby() { 
      setBackground(Color.WHITE); 
      setBorder(new EmptyBorder(5, 5, 5, 5)); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

//   setBackground(Color.WHITE); 
      Graphics2D g2 = (Graphics2D) g; 

      Insets insets = getInsets(); 
      int horontialPadding = insets.left + insets.right; 
      int verticalPadding = insets.top + insets.bottom; 

      int width = getWidth() - horontialPadding; 
      int height = getHeight() - verticalPadding; 

      int size = Math.min(width, height)/10; 

      int xOffset = insets.left + ((width - (size * 10))/2); 
      int yOffset = insets.top + ((height - (size * 10))/2); 

      for (int vertical = 0; vertical < 10; vertical++) { 
       for (int horzontial = 0; horzontial < 10; horzontial++) { 
        int x = horzontial * size; 
        int y = vertical * size; 
        g2.setColor(Color.WHITE); 
        if (vertical % 2 == 0) { 
         if (horzontial % 2 == 0) { 
          g2.setColor(Color.BLACK); 
         } 
        } else if (horzontial % 2 != 0) { 
         g2.setColor(Color.BLACK); 
        } 
        g2.fillRect(xOffset + x, yOffset + y, size, size); 
       } 
      } 
      g2.setColor(Color.BLACK); 
      g2.drawRect(xOffset, yOffset, size * 10, size * 10); 
     } 
    } 
} 

對不起,我優化的繪圖代碼,現在它可以調整基礎上的可用空間。另外,你絕不應該在任何paint方法中更新UI的狀態(比如調用setBackground),這是一個非常糟糕的主意,它可能導致無限的paint循環,這會消耗你的CPU週期並渲染你的系統不可用(是的,我已經這樣做)

作爲一般的經驗法則,您應該更喜歡paintComponent而不是paint。請參閱Painting in AWT and SwingPerforming Custom Painting瞭解更多詳情

+0

感謝提示,我剛開始學習圖形。你的代碼看起來真的比我的先進,嘿嘿:) – EyeMaze

+0

不是真的,這是你已經做了什麼的基本概念,我只是讓它更「可變」,但那是因爲我想控制董事會的規模更好。使用'GridLayout'的基本概念應該適用於你的代碼(但你要注意'getPreferredSize';)) – MadProgrammer

0

我已經設法完成我自己的任務。以下是代碼,以防有人遇到類似問題。

public void paint(Graphics g) { 
     super.paint(g); 

     rysujWarcaby((Graphics) g, 50, 50); 
     rysujWarcaby((Graphics) g, 50, 500); 
     rysujWarcaby((Graphics) g, 500, 50); 
     rysujWarcaby((Graphics) g, 500, 500); 

} 

public void rysujWarcaby(Graphics g, int x, int y) { 
     int xx = 1; 
     int nr = 9; 
     setBackground(Color.YELLOW); 
     Graphics2D g2 = (Graphics2D) g; 
     Stroke lineStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, 
         BasicStroke.JOIN_MITER); 
     g2.setStroke(lineStroke); 
     g2.setColor(Color.BLACK); 

     for (int i = 0; i < nr; i++) { 

       xx = i * 50; 
       g2.draw(new Line2D.Double(x + xx, y, xx + x, y + 50 * 8)); 

       g2.draw(new Line2D.Double(x, y + xx, x + 50 * 8, y + xx)); 

     } 

}