- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我潜伏了很长时间后的第一篇文章。我正在尝试编写一个 java 程序来训练我的计算技能,因为可汗学院删除了求和、减法等永无休止的模式。
我以某种方式设法编写了框架,但当我必须实现监听器时,我陷入了困境:如果我创建一个实现 ActionListener 的类,一切都会正常。但是,当我尝试使用实现 ActionListener 的子类时,代码会中断。 我想找出原因。
我有 3 节课。
问题:生成2个随机整数
public class Question {
public int rand1;
public int rand2;
public Question (){
rand1 = (int) (100 +(Math.random()*900)); // to be sure I have at least 3 digits. See AnswerV2.generate()
rand2 = (int) (100 + (Math.random()*900));
}
}
Answersv2:获取 2 个随机整数 从问题中求和,创建 3 个不同的答案切换 数字,添加正确答案并打乱它们。
导入java.util.ArrayList;导入 javax.swing.JButton;导入 java.util.Collections;
公开课 Answersv2 { 公共(public)ArrayList Answer_list = new ArrayList(); 公共(public) int int1; 公共(public) int int2; 字符串 uno;
public Answersv2 (int a, int b) {
int1 = a;
int2 = b;
}
public void generate (){
StringBuilder due = new StringBuilder();
StringBuilder tre = new StringBuilder();
StringBuilder quattro = new StringBuilder();
uno = Integer.toString(int1+int2); // create the string version of int1+int2
ArrayList <Character> first_answer = new ArrayList<Character>(); // create an arraylist of char to store the chars
for (char c : uno.toCharArray()) {
first_answer.add(c);
}
Collections.swap(first_answer,first_answer.size()-2,first_answer.size()-1); // switch tens with units
for (char c : first_answer) {
due.append(c);
}
String dueString = due.toString();
Collections.swap(first_answer,first_answer.size()-3,first_answer.size()-2); // switchs hundres with tens
for (char c : first_answer) {
tre.append(c);
}
String treString = tre.toString();
Collections.swap(first_answer,first_answer.size()-2,first_answer.size()-1); // switch tens with units
for (char c : first_answer) {
quattro.append(c);
}
String quattroString = quattro.toString();
add(uno,dueString,treString,quattroString);
}
public void add (String one,String two,String three,String four){
Answer_list.add(one);
Answer_list.add(two);
Answer_list.add(three);
Answer_list.add(four);
shuffle();
}
public void shuffle() {
Collections.shuffle(Answer_list);
}
public void stampa (){ // command code line version to test the program, ignore this
System.out.println("--------------------------------");
System.out.println(int1 + " + " + int2 + " = : ");
System.out.println("A " + Answer_list.get(0));
System.out.println("B " + Answer_list.get(1));
System.out.println("C " + Answer_list.get(2));
System.out.println("D " + Answer_list.get(3));
}
public class CoolButton extends JButton{
public CoolButton(String answer) {
setText(answer);
}
public boolean checkme() { // method to check if the button pressed was the one with the right answer. I still haven't implemented this properly, ignore this too
if (getText() == uno) {
return true;
} else {
return false;
}
}
}
}
3 QuizV2:创建 GUI 并启动程序。
现在...我创建了 QuizV2 的 StartListener 子类,以便使按钮能够从 QuizV2 的 main 中创建的答案对象中读取 4 个答案,并使用它来setText() 并更改标签文本等。
这是带有子类的代码 (Quizv2):
import java.util.ArrayList;
import java.util.Collections;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Quizv2{
public MyLabel label = new MyLabel("Click Start");
JButton button = new JButton("Start");
Answersv2 pinolo;
Question domanda;
Answersv2.CoolButton button1;
Answersv2.CoolButton button2;
Answersv2.CoolButton button3;
Answersv2.CoolButton button4;
public static void main (String [] args) {
Quizv2 quiz = new Quizv2();
quiz.go();
}
public void go () {
Question domanda = new Question();
Answersv2 pinolo = new Answersv2(domanda.rand1,domanda.rand2);
pinolo.generate();
button1 = pinolo.new CoolButton(pinolo.Answer_list.get(0));
button1.setAlignmentX(Component.CENTER_ALIGNMENT);
button2 = pinolo.new CoolButton(pinolo.Answer_list.get(1));
button2.setAlignmentX(Component.CENTER_ALIGNMENT);
button3 = pinolo.new CoolButton(pinolo.Answer_list.get(2));
button3.setAlignmentX(Component.CENTER_ALIGNMENT);
button4 = pinolo.new CoolButton(pinolo.Answer_list.get(3));
button4.setAlignmentX(Component.CENTER_ALIGNMENT);
JFrame frame = new JFrame("SPI trainer - Sum");
JPanel panel = new JPanel();
label.setAlignmentX(Component.CENTER_ALIGNMENT);
int R = (int) (Math.random( )*256);
int G = (int)(Math.random( )*256);
int B= (int)(Math.random( )*256);
Color randomColor = new Color(R, G, B);
label.setForeground(randomColor);
panel.add(label);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
panel.add(button);
ActionListener doGreeting = new StartListener();
button.addActionListener(doGreeting );
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(button4);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setSize(300,300);
frame.setVisible(true);
frame.setLocationRelativeTo( null );
}
}
class StartListener extends Quizv2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("boo");
label.setLabelText("The button text changed.");
}
}
但是,我似乎做错了什么,因为它打印了“boo”,但它并没有改变标签文本。我想避免使用
class StartListener extends Quizv2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (buttony == e.getSource()) {
label.setLabelText( domanda.rand1 + " + " + domanda.rand2 + " = : ????");
button1.setVisible(true);
button2.setVisible(true);
button3.setVisible(true);
button4.setVisible(true);
button.setVisible(false);
.....
.....
else if (buttonx == e.getSource())
....
}
}
为了找出按下了哪个按钮,以便程序知道执行哪个代码块。然后我尝试不使用子类,一切顺利。这是代码(Quizv2)
import java.util.ArrayList;
import java.util.Collections;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class Quizv2 implements ActionListener{
public MyLabel label = new MyLabel("Click Start");
JButton button = new JButton("Start");
Answersv2 pinolo;
Question domanda;
Answersv2.CoolButton button1;
Answersv2.CoolButton button2;
Answersv2.CoolButton button3;
Answersv2.CoolButton button4;
public static void main (String [] args) {
Quizv2 quiz = new Quizv2();
quiz.go();
}
public void go () {
domanda = new Question();
pinolo = new Answersv2(domanda.rand1,domanda.rand2);
pinolo.generate();
button1 = pinolo.new CoolButton(pinolo.Answer_list.get(0));
button1.setAlignmentX(Component.CENTER_ALIGNMENT);
button2 = pinolo.new CoolButton(pinolo.Answer_list.get(1));
button2.setAlignmentX(Component.CENTER_ALIGNMENT);
button3 = pinolo.new CoolButton(pinolo.Answer_list.get(2));
button3.setAlignmentX(Component.CENTER_ALIGNMENT);
button4 = pinolo.new CoolButton(pinolo.Answer_list.get(3));
button4.setAlignmentX(Component.CENTER_ALIGNMENT);
JFrame frame = new JFrame("SPI trainer - Sum");
JPanel panel = new JPanel();
label.setAlignmentX(Component.CENTER_ALIGNMENT);
int R = (int) (Math.random( )*256);
int G = (int)(Math.random( )*256);
int B= (int)(Math.random( )*256);
Color randomColor = new Color(R, G, B);
label.setForeground(randomColor); // Little bit of color
panel.add(label);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
panel.add(button);
button.addActionListener(this);
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.add(button1);
button1.setVisible(false);
panel.add(button2);
button2.setVisible(false);
panel.add(button3);
button3.setVisible(false);
panel.add(button4);
button4.setVisible(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setSize(300,300);
frame.setVisible(true);
frame.setLocationRelativeTo( null );
}
public void actionPerformed(ActionEvent e) {
label.setLabelText( domanda.rand1 + " + " + domanda.rand2 + " = : ????");
button1.setVisible(true);
button2.setVisible(true);
button3.setVisible(true);
button4.setVisible(true);
button.setVisible(false);
}
}
最佳答案
1) 我建议你把这个程序搁置一段时间。您犯了很多基本错误,所以我不知道您如何编译任何内容。你的代码是一个迷宫,这表明该程序对于你目前的能力来说太复杂了。
2) 您的帖子还表明您需要提高调试技能。提出问题时,您确实不应该发布超过 20 行代码。将问题减少到大约 20 行代码是一项可以提高调试技能的练习。您发布的 90% 的代码与您的问题无关。例如,您的整个 Answerv2 类可以简化为:
public class Answersv2 {
public ArrayList<String> Answer_list = new ArrayList<String>();
public Answersv2 () {
Answer_list.add("300", "150", "160", "170");
}
}
您真的认为您的代码计算这些字符串的方式与单击按钮无法更改标签文本的原因有关吗?事实上,你的整个 Answerv2 类(class)都是无关紧要的。
程序可以包含的代码行数与您的调试技能成正比。学完java两天就写不出500行的程序。编写 Swing 程序会增加许多 Activity 部分,因此在尝试 Swing 之前您需要牢牢掌握基础知识,例如不要尝试访问静态方法内的非静态变量。
当您在处理某些代码时遇到问题(例如继承问题)时,请启动一个新程序进行试验。使新程序尽可能简单:
1) 编写一个基本的 Swing 程序来设置相关的 swing 组件...
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyGui {
protected JLabel label = new JLabel("Hello");
protected JButton button = new JButton("Click me");
public MyGui() {
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(300, 100, 500, 300);
JPanel panel = new JPanel();
panel.add(label);
panel.add(button);
Container cpane = frame.getContentPane();
cpane.add(panel);
frame.setVisible(true);
}
}
public class SwingProg {
private static void createAndShowGUI() {
new MyGui();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
} }
2)在同一个类中获取一个actionPerformed()方法来工作:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyGui implements ActionListener { //********
protected JLabel label = new JLabel("Hello");
protected JButton button = new JButton("Click me");
public MyGui() {
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(300, 100, 500, 300);
JPanel panel = new JPanel();
panel.add(label);
button.addActionListener(this); //**********
panel.add(button);
Container cpane = frame.getContentPane();
cpane.add(panel);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) { //**************
System.out.println("boo");
label.setText("The button was clicked!");
}
}
public class SwingProg {
private static void createAndShowGUI() {
new MyGui();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
3) 现在尝试继承MyGui并将actionPerformed方法放在子类中。好吧,所以你不知道如何让它发挥作用。现在至少您有一个可以发布的简单示例。
您的按钮的问题是:您从未指定子类中的 actionPerformed() 方法应该是按钮的监听器。这是您问题的解决方案:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyGui {
protected JLabel label = new JLabel("Hello");
protected JButton button = new JButton("Click me");
public MyGui() {
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(300, 100, 500, 300);
JPanel panel = new JPanel();
panel.add(label);
panel.add(button);
Container cpane = frame.getContentPane();
cpane.add(panel);
frame.setVisible(true);
}
}
class StartListener extends MyGui implements ActionListener {
public StartListener(){
super();
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
System.out.println("boo");
label.setText("The button text changed.");
}
}
public class SwingProg {
private static void createAndShowGUI() {
new StartListener();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
不要尝试在复杂的程序中解决问题。相反,将问题外推到一个新程序中,并在新程序中解决问题。
关于Java:监听器子类不会更改父类(super class)按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386887/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!