2017-02-21 10 views
0

新しいランダムロールをクリックして再描画すると、そのロールをシミュレートするダイを描きます。私は静的最終フィールドmiddleXとmiddleYを持つクラスダイを持っていると私はそれらのフィールドから他のドットの座標を計算しています。Java Swing Die drawing

私が最初に質問したのは、新しく生成された番号を切り替えているため、さらに多くのコードの複製があるため、ドットを描画する効率的な方法です。最後に私の最後の質問は、dieオブジェクトを直接使用せずに、mouseListenerのDieクラスにあるメソッドを呼び出す方法があるかどうかです。 mouseListenerのコードは、どのダイがクリックされてもクリックを処理できるようにしたい。

private class MyAdapter extends MouseAdapter 
{  
    public void mouseClicked(MouseEvent event) 
    {  
     die.updateVal((int) Math.floor(Math.random()*6) +1); 
     die.repaint(); 
    } 
} 
+0

コードを含めると簡単に質問にお答えします。また、最初のものが広すぎるので、最後のより具体的な質問(mouseListener)に注意を集中させると、恩恵を受ける可能性があります。 See [ask]。 – walen

+2

サンプルコードがないと、これに答えることは難しい – Lemonov

+0

[この例](http://stackoverflow.com/questions/21033199/how-do-i-stop-my-paint-method-form-repeating-twice/21033258# 21033258)はあなたの最初の質問のアイデアを提供する必要があります – MadProgrammer

答えて

3

..whatは

...ダイの顔を表現

使用既存のUnicode文字のドットを描画するのにも、より効率的な方法です。彼らはコードポイント9856で始まる。

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.util.Random; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class DieRoll { 

    private JComponent ui = null; 
    int dieStart = 9856; 
    JLabel dieLabel = new JLabel(); 
    Random r = new Random(); 

    DieRoll() { 
     initUI(); 
    } 

    public void initUI() { 
     ui = new JPanel(new BorderLayout(4, 4)); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 

     Font dieFont = null; 
     Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); 
     String firstDie = new String(Character.toChars(dieStart)); 
     for (Font font : fonts) { 
      if (font.canDisplayUpTo(firstDie)<0) { 
       // the first font that will render the Die Faces 
       dieFont = font; 
       break; 
      } 
     } 
     dieLabel.setFont(dieFont.deriveFont(200f)); 
     ui.add(dieLabel); 

     setDie(); 

     Action rollDie = new AbstractAction("Roll the Die") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       setDie(); 
      } 
     }; 
     ui.add(new JButton(rollDie), BorderLayout.PAGE_START); 
    } 

    private void setDie() { 
     StringBuilder sb = new StringBuilder("<html><body>"); 
     // convert the numbers to HTML Unicode characters 
     sb.append(String.format("&#%1s; ", dieStart + r.nextInt(6))); 
     sb.append(String.format("&#%1s; ", dieStart + r.nextInt(6))); 

     dieLabel.setText(sb.toString()); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       DieRoll o = new DieRoll(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}