第二次设置JPanel对象的背景
Set background of JPanel object a second time
为了帮助更多地了解 Java 中的 EventListeners
,我创建了一个简单的程序,其中包含一个 JFrame
和两个 JPanels
以及所有它应该要做的是在点击 Jpanel
时切换辅助颜色。
我的代码在每个 JPanel 被单击时将其更改为新的辅助颜色,但当它被第二次单击时它会恢复为原始颜色。我需要更改什么才能使其正常工作?我已经尝试多次重写代码,所以我一定是遗漏了一些关于 EventListeners 或 JPanels 如何工作的概念。
package com.spencerlarry;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class View extends JFrame{
public static final int OFF = 1;
public static final int ON = 1;
public static final String DARKGRAY = "#696969";
public static final String CYAN = "#00FFFF";
Space top;
Space bottom;
public View(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Window Test");
this.setSize(300, 300);
this.setMinimumSize(getSize());
this.setLayout(new GridLayout(2,1));
add(new Space());
add(new Space());
}
public class Space extends JPanel implements MouseListener{
private String color;
public Space(){
setBackground(Color.decode(DARKGRAY));
addMouseListener(this);
}
public String getColor(String c){
return color;
}
public void setColor(){
if(color == CYAN){
setBackground(Color.decode(DARKGRAY));
}
else{
setBackground(Color.decode(CYAN));
}
}
@Override
public void mouseClicked(MouseEvent e) {
this.setColor();
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
}
首先,don't compare Strings
with ==
。你的 if 语句应该是:
if(color.equals(CYAN))
但这将在第一次抛出空指针异常,因为您没有初始化 color
的值。
您实际上并没有设置或更改 color
变量的值,因此当您检查
if(color == CYAN)
它总是求值为 false,这意味着您总是在调用
setBackground(Color.decode(CYAN));
当你点击时,无论如何。
在你的 Space
构造函数中,你应该将 color
初始化为 DARKGRAY
(以避免空指针异常),然后将 setColour()
更改为如下所示:
public void setColor(){
if(color.equals(CYAN)){
setBackground(Color.decode(DARKGRAY));
color = DARKGRAY;
}
else{
setBackground(Color.decode(CYAN));
color = CYAN;
}
}
除了@gla3dr给出的答案,为什么每次都解码颜色字符串?只需定义:
public static final Color MY_DARKGRAY = new Color("#696969");
// there is already a standard Color.CYAN, so don't re-define it
然后在构造函数中设置颜色,
public void setColor(){
if( color == Color.CYAN )){
setBackground( MY_DARKGRAY );
color = MY_DARKGRAY;
}
else{
setBackground(Color.CYAN);
color = Color.CYAN;
}
}
为了帮助更多地了解 Java 中的 EventListeners
,我创建了一个简单的程序,其中包含一个 JFrame
和两个 JPanels
以及所有它应该要做的是在点击 Jpanel
时切换辅助颜色。
我的代码在每个 JPanel 被单击时将其更改为新的辅助颜色,但当它被第二次单击时它会恢复为原始颜色。我需要更改什么才能使其正常工作?我已经尝试多次重写代码,所以我一定是遗漏了一些关于 EventListeners 或 JPanels 如何工作的概念。
package com.spencerlarry;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class View extends JFrame{
public static final int OFF = 1;
public static final int ON = 1;
public static final String DARKGRAY = "#696969";
public static final String CYAN = "#00FFFF";
Space top;
Space bottom;
public View(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Window Test");
this.setSize(300, 300);
this.setMinimumSize(getSize());
this.setLayout(new GridLayout(2,1));
add(new Space());
add(new Space());
}
public class Space extends JPanel implements MouseListener{
private String color;
public Space(){
setBackground(Color.decode(DARKGRAY));
addMouseListener(this);
}
public String getColor(String c){
return color;
}
public void setColor(){
if(color == CYAN){
setBackground(Color.decode(DARKGRAY));
}
else{
setBackground(Color.decode(CYAN));
}
}
@Override
public void mouseClicked(MouseEvent e) {
this.setColor();
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
}
首先,don't compare Strings
with ==
。你的 if 语句应该是:
if(color.equals(CYAN))
但这将在第一次抛出空指针异常,因为您没有初始化 color
的值。
您实际上并没有设置或更改 color
变量的值,因此当您检查
if(color == CYAN)
它总是求值为 false,这意味着您总是在调用
setBackground(Color.decode(CYAN));
当你点击时,无论如何。
在你的 Space
构造函数中,你应该将 color
初始化为 DARKGRAY
(以避免空指针异常),然后将 setColour()
更改为如下所示:
public void setColor(){
if(color.equals(CYAN)){
setBackground(Color.decode(DARKGRAY));
color = DARKGRAY;
}
else{
setBackground(Color.decode(CYAN));
color = CYAN;
}
}
除了@gla3dr给出的答案,为什么每次都解码颜色字符串?只需定义:
public static final Color MY_DARKGRAY = new Color("#696969");
// there is already a standard Color.CYAN, so don't re-define it
然后在构造函数中设置颜色,
public void setColor(){
if( color == Color.CYAN )){
setBackground( MY_DARKGRAY );
color = MY_DARKGRAY;
}
else{
setBackground(Color.CYAN);
color = Color.CYAN;
}
}