在向main添加一个类puzzle对象后,所有内容都会按其应该的方式显示。当我点击任何一个按钮时,一些状态索引应该换成相反的状态,从true换成false或从false换成true。
不幸的是,button clicking不想注册数组中的任何按钮,但它确实注册了一个由自身初始化的按钮。我怎样才能解决这个问题?
我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
public class Puzzle extends JFrame implements ActionListener
{
int doors = 8;
boolean [] state = new boolean[doors];
JButton [] levers = new JButton[doors];
JButton weird = new JButton("weird lever");
JLabel display = new JLabel();
Puzzle()
{
reset();
this.setSize(new Dimension(1920, 1080));
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setResizable(false);
this.setLayout(null);
this.add(display);
this.add(weird);
int num = levers.length;
int start = 50;
int size = (1920-(num+1)*start)/num;
char label = 'A';
display.setBounds(size*2, 150, 2000, 300);
display.setFont(new Font("Arial Black", Font.PLAIN, 200));
Display();
for(JButton i : levers)
{
i = new JButton(String.valueOf(label));
label++;
i.setBounds(start, 500, size, size);
start+=(size+50);
i.addActionListener(this);
i.setFont(new Font("Arial black", Font.PLAIN, size/2));
i.setFocusable(false);
this.add(i);
}
weird.setFocusable(false);
weird.setBounds(550, 800, 800, 200);
weird.setFont(new Font("Arial Black", Font.PLAIN, size/2));
weird.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
/*if(e.getSource() == levers[0])
{
state[2] = Swap(state[2]);
Display();
}
if(e.getSource() == levers[1])
{
state[4] = Swap(state[4]);
state[6] = Swap(state[6]);
Display();
}
if(e.getSource() == levers[2])
{
state[2] = Swap(state[2]);
state[3] = Swap(state[3]);
state[6] = Swap(state[6]);
state[7] = Swap(state[7]);
Display();
}
if(e.getSource() == levers[3])
{
state[0] = Swap(state[0]);
state[2] = Swap(state[2]);
state[7] = Swap(state[7]);
Display();
}
if(e.getSource() == levers[4])
{
state[1] = Swap(state[1]);
state[3] = Swap(state[3]);
state[4] = Swap(state[4]);
state[5] = Swap(state[5]);
Display();
}
if(e.getSource() == levers[5])
{
state[0] = Swap(state[0]);
state[2] = Swap(state[2]);
state[6] = Swap(state[6]);
Display();
}
if(e.getSource() == levers[6])
{
state[1] = Swap(state[1]);
state[5] = Swap(state[5]);
Display();
}
if(e.getSource() == levers[7])
{
state[1] = Swap(state[1]);
state[2] = Swap(state[2]);
state[4] = Swap(state[4]);
state[5] = Swap(state[5]);
Display();
}
*/
if(e.getSource() == levers[0])
{
display.setText("A works");
}
if(e.getSource() == weird)
{
display.setText("test");
}
}
boolean Swap(boolean n)
{
return !n;
}
void Display()
{
StringBuilder toDisplay = new StringBuilder();
for (boolean j : state)
{
if (j)
{
toDisplay.append("| ");
} else
toDisplay.append("_ ");
}
display.setText(toDisplay.toString());
}
void reset ()
{
Arrays.fill(state, true);
}
}```
2条答案
按热度按时间qybjjes11#
button clicking不想注册数组中的任何按钮,但它只注册一个按钮
向actionlistener添加一些调试代码,您将看到
levers[0]
为“空”。创建按钮,但从不将每个按钮的示例添加到数组中。
为什么要使用“i”作为变量名。通常,“i”用作索引。使用适当的变量名,如“按钮”。但是,在这种情况下,您不希望使用“for-each”循环。
相反,您需要一个普通for循环,以便在创建每个按钮时为数组编制索引以添加按钮:
其他问题:
方法名称不应以大写字符开头。
在使框架可见之前,应将构件添加到框架中。
应在上创建组件
Event Dispatch Thread (EDT)
.不要使用null布局和setbounds()。swing设计用于布局管理器。
不要硬编码屏幕大小。相反,你可以使用
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
,因此它适用于所有屏幕大小。cgfeq70w2#
导言
你的代码太复杂了,我无法理解。我喜欢简单的代码。短方法和简单类。
这是我设计的图形用户界面。
这是我点击几个字母后的gui
JButtons
解释
oracle有一个漂亮的教程,使用jfc/swing创建gui,它将向您展示如何创建swing gui。跳过netbeans部分。
您的代码缺少一个主方法,因此我添加了一个。我通过调用
SwingUtilities
invokeLater
方法。此方法确保在事件分派线程上创建和执行swing组件。我做的第一件事就是创建一个
PuzzleModel
类来保存布尔数组。将模型与视图和控制器类分开是个好主意。此模式是模型/视图/控制器(mvc)模式。秋千
JFrame
可以容纳许多JPanels
. 我创建了一个片段JPanel
举行JLabel
和JButton
垂直对齐。我用了GridBagLayout
对齐JLabel
及JButton
. swing布局管理器帮助您避免绝对定位和绝对定位带来的问题。我创建了一个主
JPanel
举行8节JPanels
. 这些JPanels
与一个FlowLayout
.正如你所看到的,我的
JFrame
比你的小。你创建一个小的JFrame
尽可能的。如果用户想把它变大,右上角的矩形就是用来做这个的。秋千是由内而外设计的。您没有指定
JFrame
调整尺寸并尝试使组件适合。创建组件并让swing确定组件的大小JFrame
. 如果你想要JFrame
我创造了更大,增加字体大小。提示:72点的分数或倍数在大多数显示器上看起来更好。我创造了两个
ActionListener
类,一个用于字母表JButtons
还有一个是杠杆JButton
. 这使得我们更容易关注字母表JButtons
. 在这个世界上你所要做的就是ActionListener
交换合适吗isVertical
左键单击每个jbutton时的布尔值。我只是翻转了相应的布尔值作为演示。代码
下面是完整的可运行代码。