2017-11-19 12 views
2

基本的に私は反転ゲームを作成しようとしています。まず、ボタンと属性IDが付いたボードを作成したので、必要に応じて後でアクセスすることができます。今私は各ボタンにゲームピースを描画しようとしていますが、私はそれが悪い考えであり、nullを返すので、ボタンのgetGraphics()はできません。ボード、セル、ピースは、MVCパターンを使って開発しているので、私はすべてのエンティティを別々にしておきたいと思います。JButtonの上に楕円を描く

board.java

import java.awt.GridLayout; 
import javax.swing.JPanel; 

public class Board extends JPanel { 
    private static final int sizeOfBoard = 8; 

    public Board() { 
     int id =0; 
     setLayout(new GridLayout(sizeOfBoard,sizeOfBoard)); 
     for (int i = 0; i < sizeOfBoard; i++) { 
      for (int j = 0; j < sizeOfBoard; j++) { 
       Cell cell = new Cell(id++); 
       Disk disk = new Disk(); 
       cell.add(disk); 
       add(cell); 
      } 
     } 

     setSize(600,500); 
     setVisible(true); 
    } 

cell.java

import java.awt.Graphics; 
import javax.swing.JButton; 
import javax.swing.Painter; 

    public class Cell extends JButton{ 
     private int id; 
     private boolean taken; 
     private String colour; 
     private Painter painter; 

     public Cell(int id){ 
      this.id = id; 
     } 

     public int getId(){ 
      return id; 
     } 

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

disk.java

import java.awt.Graphics; 
import javax.swing.JComponent; 


public class Disk extends JComponent{ 

    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(50,50,50,50); 
    } 
} 

TL; DR各ボタンに楕円形のコードを書き直すにはどうすればよいですか?

ありがとうございます。

答えて

3

最も簡単な解決策は、楕円形またはディスクイメージをBufferedImageで作成し、それをImageIconに挿入し、単にsetIcon(myIcon)メソッドを使用してJButtonまたはJLabel上のアイコンを交換することです。これは私のGUI、最初の状態のための空白の1つ、そして占有状態の2つの異なる色のものであれば、私は3つのImageIconを作成したいと思います。例えば

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.RenderingHints; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ReversiPanel extends JPanel { 
    private static final int SIDES = 8; 
    private static final int ICON_LENGTH = 60; 
    private static final Color BG = Color.BLACK; 
    private static final Color LABEL_COLOR = Color.GREEN.darker(); 
    private JLabel[][] labelGrid = new JLabel[SIDES][SIDES]; 
    private Icon blankIcon; 
    private Icon blackIcon; 
    private Icon whiteIcon; 

    public ReversiPanel() { 
     blankIcon = createIcon(new Color(0, 0, 0, 0)); 
     blackIcon = createIcon(Color.BLACK); 
     whiteIcon = createIcon(Color.WHITE); 

     setBackground(BG); 
     setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 
     setLayout(new GridLayout(SIDES, SIDES, 1, 1)); 
     MyMouse myMouse = new MyMouse(); 
     for (int i = 0; i < labelGrid.length; i++) { 
      for (int j = 0; j < labelGrid[i].length; j++) { 
       JLabel label = new JLabel(blankIcon); 
       label.setOpaque(true); 
       label.setBackground(LABEL_COLOR); 
       label.addMouseListener(myMouse); 
       labelGrid[i][j] = label; 
       add(label); 
      } 
     } 
    } 

    private Icon createIcon(Color color) { 
     BufferedImage img = new BufferedImage(ICON_LENGTH, ICON_LENGTH, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(color); 
     int gap = 4; 
     int w = ICON_LENGTH - 2 * gap; 
     int h = w; 
     g2.fillOval(gap, gap, w, h); 
     g2.dispose(); 
     return new ImageIcon(img); 
    } 

    private class MyMouse extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      JLabel label = (JLabel) e.getSource(); 
      Icon icon = label.getIcon(); 
      if (icon == blankIcon) { 
       label.setIcon(blackIcon); 
      } else if (icon == blackIcon) { 
       label.setIcon(whiteIcon); 
      } else { 
       label.setIcon(blankIcon); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     ReversiPanel mainPanel = new ReversiPanel(); 

     JFrame frame = new JFrame("ReversiPanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

@RMS:例えば、コンパイルして上記の私の[MCVE]コードを実行します。それはJLabelsを使用しているので、それは私にとってはよりきれいですが、JButtonも同様に機能します。 –

+0

ありがとうございました。このようなアプローチは、私がやっていることよりも優れています。心から感謝する。 – Frisco

関連する問題