Java 如何通过声明的名称引用局部变量
如果我有一个按钮点击处理程序函数,我希望能够通过其引用名称(例如最小化按钮或最大化按钮)而不是通过使用:Java 如何通过声明的名称引用局部变量,java,swing,Java,Swing,如果我有一个按钮点击处理程序函数,我希望能够通过其引用名称(例如最小化按钮或最大化按钮)而不是通过使用: 注意:我不想将其声明为类变量 编辑:我需要在一个函数中处理按钮点击的原因是我不想重复代码(见下文)。我不想要以下内容: class Game extends JFrame { public Game() { JButton minimize_button = new JButton(); minimize_button.addMouse
注意:我不想将其声明为类变量
编辑:我需要在一个函数中处理按钮点击的原因是我不想重复代码(见下文)。我不想要以下内容:
class Game extends JFrame
{
public Game()
{
JButton minimize_button = new JButton();
minimize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
int window_state = Game.this.getExtendedState();
if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
Game.this.setExtendedState(JFrame.ICONIFIED);
}
});
JButton maximize_button = new JButton();
maximize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
int window_state = Game.this.getExtendedState();
if (window_state == JFrame.NORMAL)
window_state = JFrame.MAXIMIZED_BOTH;
else if (window_state == JFrame.MAXIMIZED_BOTH)
window_state = JFrame.NORMAL;
Game.this.setExtendedState(window_state);
}
});
}
}
注意:请不要评论“哦,你应该这样做”。我想知道的是,我可以通过引用名引用变量吗。如果是,怎么做?上述示例中的反射将不起作用,正如我所述,我不想将它们声明为类变量。
在您的示例中,您试图访问其范围之外的最小化按钮和最大化按钮。它们不再在您声明它们的Game()构造函数之外“存在”。无法改变这一点 另一种方法是将它们声明为类变量,即属性。你已经声明你不想要这个 我能提出的使其编译的最简单的更改如下。我不建议这样做,但它在您确定的约束范围内回答了您的问题。在这里,我将最小化和最大化按钮引用传递到“共享”方法setWindowsState()
你看了吗?(1-)什么重复代码?我看到的唯一重复代码是获取/设置扩展状态。没有理由做你正在做的事情。您确实使整个过程复杂化了。最小化和最大化侦听器都包含不同的功能,不应组合到单个侦听器中。您甚至不应该在JButton上使用鼠标侦听器。您应该使用
ActionListener
@camickr,您是正确的,只修改了一个设置。然而,正如我所指出的,以上只是一个例子。每当窗口状态改变时,我都会做一些改变。关于“您应该使用…”的问题,请阅读下面的注释。@johnny,下面的注释没有任何意义。如果你问了一个问题,那么这个问题应该是有意义的,发布的代码也应该是有意义的,这样我们才能更好地理解你的问题。试图用鼠标听器来听按钮的点击,表明您不熟悉Swing。不熟悉Swing还可能表明您正在做出其他糟糕的设计决策,例如您在这里试图做的事情。还有更好的解决方案。例如,您可以创建一个自定义的ActionListener
,它接受布尔值参数(我们称之为)isMaximize
。然后创建两个ActionListeners
,每个按钮一个,值为真/假。然后,逻辑内部是基于布尔值的,引用名称是不相关的。您不应该基于引用名称进行编码。所以你应该寻求更好的方法来解决这个问题,正如我已经明确指出的,我不想通过名字来引用一个对象。我想知道的是,我可以通过引用名引用变量吗。我的代码只是一个例子来说明我试图实现的目标。@johnny抱歉,我只是想指导您编写更健壮、可维护的代码。我已经更新了我的答案。简言之,你追求的是根本不可能的。”@adam”,不需要道歉。我怀疑这是不可能的。我想Object.setName(字符串)就可以了。
class Game extends JFrame
{
public Game()
{
JButton minimize_button = new JButton();
minimize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
setWindowState(mouse);
}
});
JButton maximize_button = new JButton();
maximize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
setWindowState(mouse);
}
});
}
private void setWindowState(MouseEvent mouse)
{
int window_state = Game.this.getExtendedState();
JButton button = (JButton)mouse.getComponent();
if (button == minimize_button)
{
if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
window_state = JFrame.ICONIFIED;
}
else if (button == maximize_button)
{
if (window_state == JFrame.NORMAL)
window_state = JFrame.MAXIMIZED_BOTH;
else if (window_state == JFrame.MAXIMIZED_BOTH)
window_state = JFrame.NORMAL;
}
Game.this.setExtendedState(window_state);
}
}
class Game extends JFrame
{
public Game()
{
JButton minimize_button = new JButton();
minimize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
int window_state = Game.this.getExtendedState();
if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
Game.this.setExtendedState(JFrame.ICONIFIED);
}
});
JButton maximize_button = new JButton();
maximize_button.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent mouse)
{
int window_state = Game.this.getExtendedState();
if (window_state == JFrame.NORMAL)
window_state = JFrame.MAXIMIZED_BOTH;
else if (window_state == JFrame.MAXIMIZED_BOTH)
window_state = JFrame.NORMAL;
Game.this.setExtendedState(window_state);
}
});
}
}
public Game() {
JButton minimize_button = new JButton();
JButton maximize_button = new JButton();
minimize_button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouse) {
setWindowState(mouse, minimize_button, maximize_button);
}
});
maximize_button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouse) {
setWindowState(mouse, minimize_button, maximize_button);
}
});
}
private void setWindowState(MouseEvent mouse, JComponent minimize_button, JComponent maximize_button) {
int window_state = Game.this.getExtendedState();
JButton button = (JButton) mouse.getComponent();
if (button == minimize_button) {
if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
window_state = JFrame.ICONIFIED;
} else if (button == maximize_button) {
if (window_state == JFrame.NORMAL) {
window_state = JFrame.MAXIMIZED_BOTH;
} else if (window_state == JFrame.MAXIMIZED_BOTH) {
window_state = JFrame.NORMAL;
}
}
Game.this.setExtendedState(window_state);
}