2017-02-21 5 views
0

ich eine Form bin Zeichnung, die eine neue zufällige Rolle simuliert, wenn Sie darauf klicken und zeichnet es. Ich habe eine Klasse Die mit statischen Endfeldern middleX und middleY und berechne die Koordinaten der anderen Punkte aus diesen Feldern.Java Swing Die Zeichnung

Meine erste Frage ist, was ist eine noch effizientere Art und Weise, die Punkte zu zeichnen, weil ich die neu erzeugte Zahl am Schalten und es gibt eine Menge von Code-Duplizierung. Schließlich ist meine letzte Frage, ob es eine Möglichkeit gibt, eine Methode aufzurufen, die sich in der Die-Klasse in einem mouseListener befindet, ohne das Würfelobjekt direkt zu verwenden. Ich möchte, dass der Code im mouseListener mit Klicks umgehen kann, egal auf welchen Würfel geklickt wird.

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

Es wird einfacher sein, Ihnen mit Ihrer Frage zu helfen, wenn Sie den Code hinzufügen. Sie können auch davon profitieren, wenn Sie die Aufmerksamkeit in der letzten, konkreteren Frage (mouseListener) zentrieren, da die erste zu breit ist. Siehe [fragen]. – walen

+2

Ohne Beispielcode ist es schwer, diese – Lemonov

+0

[Dieses Beispiel] zu beantworten (http://stackoverflow.com/questions/21033199/how-do-i-stop-my-paint-method-form-repeating-twice/21033258# 21033258) sollte eine Idee für Ihre erste Frage – MadProgrammer

Antwort

3

..was die Punkte der Zeichnung eine noch effizientere Art und Weise ist ..

Vorhandene verwenden Unicode-Zeichen, die Die Gesichter repräsentieren. Sie beginnen bei Codepunkt 9856. E.G.

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); 
    } 
}