2017-02-21 65 views
0

我正在绘制一个模拟一个新的随机卷,当你点击它并重画它。我有一个类静态最终字段中间和中间Y,我正在计算从这些领域的其他点的坐标。Java Swing Die drawing

我的第一个问题是什么是更有效的绘制点的方式,因为我正在切换新生成的数字,并且有很多代码重复。最后,我的最后一个问题是如果有一种方法可以调用mouseListener中的Die类中的方法,而无需直接使用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)中,您可能会受益,因为第一个问题太宽泛。见[问]。 – walen

+2

没有示例代码很难回答这个问题 – Lemonov

+0

[This example](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); 
    } 
}