Добавете множество форми на люлка/awt към рамката

Създадох игра на Craps, която е игра, базирана на зарове. Създадох моята логика на играта, но се опитвам да внедря GUI. Създадох моите зарове и компонент за зарове и за двата зара. Ако добавя моите зарове към рамката един по един, и двете работят, но щом се опитам да добавя и двете към рамката едновременно и стартирам моята игра Craps, рамката е празна.

Код на CrapsGame:

package crapsgame;
import java.awt.FlowLayout;
import javax.swing.*;


public class CrapsGameTester 
{

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
    JFrame frame = new JFrame("Craps-Game");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    final int FRAME_WIDTH = 400;
    final int FRAME_HEIGHT = 600;

    frame.setSize(FRAME_HEIGHT, FRAME_WIDTH);

    CrapsGame game = new CrapsGame();

    JPanel panel = new JPanel(new FlowLayout());
    frame.add(panel);

    Dice1Component dice1 = new Dice1Component(6);
    Dice2Component dice2 = new Dice2Component(6);
    panel.add(dice1);
    panel.add(dice2);

    String message = game.doFirstRoll();
    System.out.println(message);

    while(!game.isOver())
    { 
        message = game.rollAgain();
        System.out.println(message);
    }

    if(game.isWon())
        System.out.println("You win, big man!");
    else
        System.out.println("Loser ...");

    frame.setVisible(true);
}

}

Код на Dice1:

package crapsgame;

import java.awt.*;

public class Dice1 
{
int sides;
int xCoord = 150;
int yCoord = 130;

public Dice1(int s)
{
    sides = s;
}

/**
 * 
 * @param g2 Graphics2D object used by draw method
 */
public void draw(Graphics2D g2)
{
    g2.setColor(Color.BLACK);
    g2.fillRect(xCoord, yCoord, 100, 100);
    g2.setColor(Color.WHITE);

    switch (sides)
    {
        case 1:
            g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
            break;
        case 2:
            g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
            break;
        case 3:
            g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
            break;
        case 4:
            g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 15, yCoord + 65, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
            break;
        case 5:
            g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 15, yCoord + 65, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 15, 20, 20);
            g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
            g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
            break;
        case 6: 
            g2.fillOval(xCoord + 20, yCoord + 20, 20, 20);
            g2.fillOval(xCoord + 20, yCoord + 45, 20, 20);
            g2.fillOval(xCoord + 20, yCoord + 70, 20, 20);
            g2.fillOval(xCoord + 60, yCoord + 20, 20, 20);
            g2.fillOval(xCoord + 60, yCoord + 45, 20, 20);
            g2.fillOval(xCoord + 60, yCoord + 70, 20, 20);
            break;
    }
}
}

Код на Dice1Component:

package crapsgame;
import java.awt.*;
import javax.swing.*;


public class Dice1Component extends JComponent
{
private int sides;

public Dice1Component(int s)
{
    sides = s;
}

public void setSide(int s)
{
    sides = s;
}

@Override
public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    Dice1 dice1 = new Dice1(sides);
    dice1.draw(g2);
}
}

Четох, че за да добавите повече от един компонент към рамка, трябва да използвате JPanel, но това също не изглежда да работи за мен.


person hjalpmig    schedule 02.11.2014    source източник
comment
Интересно ми е защо не начертаете и двата зара върху един и същи компонент? Също така не бих създал зара вътре в метода paintComponent. Запазете го като член на класа. Имайте двама членове на класа, по един за всеки зар. Можете да имате сетер за всеки зар. Ако планирате да имате много зарове, тогава може би можете да създадете Map зарове и да получите достъп до всеки от тях чрез ключ. Но като цяло бих използвал само една чертожна повърхност.   -  person Paul Samsotha    schedule 02.11.2014
comment

Просто го направи:

let js = "var myelement = document.getElementById(\"test\");myelement.innerHTML= \"New Text\";"
webView.evaluateJavaScript(js, completionHandler: nil)

Ако използвате UIWebView вместо WKWebView, направете следното:

let js = "var myelement = document.getElementById(\"test\");myelement.innerHTML= \"New Text\";"
_ = webView.stringByEvaluatingJavaScript(from: js)
  -  person Hovercraft Full Of Eels    schedule 02.11.2014


Отговори (1)


Има няколко проблема (в допълнение към споменатите в коментарите), но те трябва да накарат кода да работи:

  • Трябва да замените предпочитания размер в Dice1Component, така че мениджърът на оформлението да може да запази правилното място

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }
    
  • премахнете xCoord и yCoord от Dice1. Използваните координати са относителни към компонента, така че голямо отместване ще се опита да начертае извън областта на компонента
  • Разгледайте урока как трябва да създавате и осъществявате достъп до компоненти само в нишката за изпращане на събитие.
person kiheru    schedule 02.11.2014