【问题标题】:Recall a class from another class从另一个班级召回一个班级
【发布时间】:2012-10-13 12:06:54
【问题描述】:

你好,我用 Java 做了一个骰子(非常简单),现在当我启动应用程序时,我得到一个非常漂亮的骰子,随机值在 1 到 6 之间,唯一不起作用的是我的按钮再次抛出(比如没有召回课程或其他什么),我希望有人能告诉我我做错了什么。您可以在下面找到我的 2 个课程

throwbutton 动作类:

package h05Dobbelsteen;

import java.awt.event.*;
import javax.swing.*;

public class Worp extends JPanel implements ActionListener {

private JButton worp;

DobbelSteen dobbelsteen;

public Worp() {

    dobbelsteen = new DobbelSteen();
    worp = new JButton("Werp de dobbelsteen");
    worp.addActionListener(this);

    add(worp);

}

@Override
public void actionPerformed(ActionEvent e) {

    dobbelsteen.roll();

}

}

我的模具类如下

package h05Dobbelsteen;

导入 java.awt.*;

导入 javax.swing.JPanel;

公共类 DobbelSteen 扩展 JPanel {

private final static int SPOT_DIAMETER = 40; // diameter dobbelsteen rondjes
private int faceValue; // getoonde waarde op scherm

public DobbelSteen() {

    roll();

}

/*
 * roll de dobbelsteen
 */
public int roll() {

    int val = (int) (6*Math.random() + 1); // bepaal getal tussen 1 - 6
    setValue(val);
    return val;

}

/*
 * set de waarde van de roll
 */
public void setValue(int spots) {
    faceValue = spots;
    repaint();
}

/*
 * get de waarde van de roll
 */
public int getValue() {
    return faceValue;
}

/*
 * teken de view van de dobbelsteen
 */
public void paintComponent(Graphics g) {

    int w = getWidth();  // Get height and width
    int h = getHeight();

    // Graphics naar 2d
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

    //... Paint background
    g2.setColor(Color.WHITE);
    g2.fillRect(0, 0, w, h);
    g2.setColor(Color.BLACK);

    g2.drawRect(0, 0, w-1, h-1);  // Draw border

    switch (faceValue) {
        case 1:
            drawSpot(g2, w/2, h/2);
            break;
        case 3:
            drawSpot(g2, w/2, h/2);

        case 2:
            drawSpot(g2, w/4, h/4);
            drawSpot(g2, 3*w/4, 3*h/4);
            break;
        case 5:
            drawSpot(g2, w/2, h/2);
        case 4:
            drawSpot(g2, w/4, h/4);
            drawSpot(g2, 3*w/4, 3*h/4);
            drawSpot(g2, 3*w/4, h/4);
            drawSpot(g2, w/4, 3*h/4);
            break;
        case 6:
            drawSpot(g2, w/4, h/4);
            drawSpot(g2, 3*w/4, 3*h/4);
            drawSpot(g2, 3*w/4, h/4);
            drawSpot(g2, w/4, 3*h/4);
            drawSpot(g2, w/4, h/2);
            drawSpot(g2, 3*w/4, h/2);
            break;
    }
}

/*
 * Teken de spots
 */
private void drawSpot(Graphics2D g2, int x, int y) {
    g2.fillOval(x-SPOT_DIAMETER/2, y-SPOT_DIAMETER/2, SPOT_DIAMETER, SPOT_DIAMETER);
}

}

JFrame 类

package h05Dobbelsteen;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.*;

public class startDobbelsteen {

JFrame frame = null;

public startDobbelsteen() {

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBackground(Color.white);
    frame.setTitle("Dobbelsteen");
    frame.setBounds(200, 200, 450, 450);

    DobbelSteen dobbelsteen = new DobbelSteen();
    frame.add(dobbelsteen, BorderLayout.CENTER);

    Worp worp = new Worp();
    frame.add(worp, BorderLayout.SOUTH);

    frame.setVisible(true);

}

}

【问题讨论】:

    标签: java actionlistener


    【解决方案1】:

    程序不完整(没有 main 方法,没有 JFrame),但是您在这个程序中没有显示任何 DobbelSteen 实例。通过显示按钮 (worp) 滚动的 DobbelSteen 永远不会添加到任何面板,因此滚动它不会改变应用程序的外观。

    【讨论】:

    • 主要方法和 Jframe 等在一个单独的类中,但我没有发布它们,因为我认为代码不相关,对于第二部分.. 我必须给 worp DobbelSteen 的构造函数?
    • 没有。你为什么要这么做? main 方法和 JFrame 可能是相关的。如果您在屏幕上看到一个骰子,它是另一个实例,在其他地方创建和添加,而不是由 worp 按钮滚动的实例。更清楚地说:你有两个骰子:一个是永远不会改变的可见骰子,另一个是不可见的,是由 worp 按钮滚动的。
    • 我已经添加了 JFrame 类。此时,DobbelSteen 的构造函数在程序启动时创建了第一个 throw,所以实际上我必须借助按钮重新启动构造函数,对吗?还是那是矫枉过正? (附 system.out.println(val) 我看到骰子的值每次都在改变,但屏幕上什么也没有)
    • Java 中的对象就像真实的对象。您的程序中有两次对new Dobbelsteen() 的调用。这意味着您创建了两个不同的模具。其中一个模具由主框架创建和显示。另一个是由 Worp 面板创建的,从不显示,但由 worp 按钮滚动。这就像有两个模具:一个在桌子上,一个在封闭的盒子里。如果你摇动盒子,盒子里的骰子会改变它的面值,但桌子上的骰子会保持不变。您必须创建 一个 骰子,并将该骰子传递给 Worp 面板,以便 worp 按钮滚动显示的骰子
    • 啊,说清楚等!我想我现在明白我的错误了,我想我可以解决这个问题,谢谢!
    【解决方案2】:
        DobbelSteen dobbelsteen;
    
        public Worp(DobbelSteen ds) {
    
            dobbelsteen = ds;
            worp = new JButton("Werp de dobbelsteen");
           worp.addActionListener(this);
    
            add(worp);
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
            dobbelsteen.roll();
    
        }
    
        }
    

    你可以试试这个。在您的 JFrame 类构造函数中创建一个 DobbelSteen 并将其添加到容器中。然后做 Worp worp = new Worp(dobbelsteenNaam);并将 worp 也添加到容器中。我不确定您的 repaint() 调用是否在正确的位置。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多