Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用平滑外观更改JButton文本和背景色_Java_Swing_Jbutton - Fatal编程技术网

Java 使用平滑外观更改JButton文本和背景色

Java 使用平滑外观更改JButton文本和背景色,java,swing,jbutton,Java,Swing,Jbutton,我从上个星期开始学习Swing,我想设计一些类似于拼图游戏的游戏,2048是为了好玩,我已经成功地编写了拼图,但在编写2048时遇到了一些问题,请参阅下面的示例代码,这些代码不是原始的,但它说明了问题 import java.awt.*; 导入javax.swing.*; 导入java.awt.event.*; @抑制警告(“串行”) 类面板扩展JPanel实现ActionListener { JButton[]按钮=新JButton[4]; 布尔标志=真; 公共事务委员会() { 这个.set

我从上个星期开始学习Swing,我想设计一些类似于拼图游戏的游戏,2048是为了好玩,我已经成功地编写了拼图,但在编写2048时遇到了一些问题,请参阅下面的示例代码,这些代码不是原始的,但它说明了问题

import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
@抑制警告(“串行”)
类面板扩展JPanel实现ActionListener
{
JButton[]按钮=新JButton[4];
布尔标志=真;
公共事务委员会()
{
这个.setLayout(新的GridLayout(1,4));
对于(int i=0;i<4;++i)
{
按钮[i]=新的JButton(“”);
按钮[i]。背景(颜色。白色);
按钮[i].addActionListener(此);
按钮[i].setPreferredSize(新尺寸(100100));
添加(按钮[i]);
}
按钮[0]。设置文本(“2”);
按钮[0]。设置背景(颜色.绿色);
}
@凌驾
已执行的公共无效行动(行动事件Ae)
{
国际单项体育联合会(旗)
{
flag=false;
按钮[0]。setText(“”);
按钮[0]。设置背景(颜色。白色);
//对于(长i=0;i<100000000 l;++i);
按钮[1]。设置文本(“2”);
按钮[1]。设置背景(颜色。绿色);
//对于(长i=0;i<100000000 l;++i);
按钮[1]。setText(“”);
按钮[1]。设置背景(颜色。白色);
//对于(长i=0;i<100000000 l;++i);
按钮[2]。设置文本(“2”);
按钮[2]。设置背景(颜色。绿色);
//对于(长i=0;i<100000000 l;++i);
按钮[2]。setText(“”);
按钮[2]。设置背景(颜色。白色);
//对于(长i=0;i<100000000 l;++i);
按钮[3]。设置文本(“2”);
按钮[3]。设置背景(颜色。绿色);
}
其他的
{
flag=true;
按钮[0]。设置文本(“2”);
按钮[0]。设置背景(颜色.绿色);
按钮[1]。setText(“”);
按钮[1]。设置背景(颜色。白色);
按钮[2]。setText(“”);
按钮[2]。设置背景(颜色。白色);
按钮[3]。setText(“”);
按钮[3]。背景(颜色。白色);
}
}
}
公共类网格
{
公共电网()
{
//我无法在真实代码中获得JFrame引用,但事实并非如此
//当然,如果我能做这件事而不用担心,那就更好了
//JFrame参考。
JFrame JFrame=新JFrame(“网格”);
jFrame.add(新面板());
jFrame.pack();
jFrame.setresizeable(false);
jFrame.setVisible(true);
}
公共静态void main(字符串[]args)
{
调用器(()->new Grid());
}
}
在上述代码中,按钮文本和颜色的变化不平稳,第一个按钮突然变为白色,最后一个按钮突然变为绿色,因此,我已经测试了第二个和第三个按钮是否通过延迟循环实际改变,但第二个和第三个按钮仍然没有改变,但它会等待一段时间来改变第一个按钮和最后一个按钮。我希望这个问题是可以理解的

注意:在现实中,我使用keybord by keybinding而不是按钮单击,我在这里使用它来说明问题

如何切换按钮的文字和颜色,使其看起来平滑


谢谢。

希望我能理解你的问题。你想要的是动画。要做到这一点,您需要使用

下面的代码演示。注意,我将类名更改为
MyPanel
,以避免与类
java.awt.Panel
冲突

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类MyPanel扩展JPanel实现ActionListener{
JButton[]按钮=新JButton[4];
布尔标志=真;
定时器;
int-currentIndex;
内特三角洲;
公共事务委员会(){
这个.setLayout(新的GridLayout(1,4));
对于(int i=0;i<4;++i){
按钮[i]=新的JButton(“”);
按钮[i]。背景(颜色。白色);
按钮[i].addActionListener(此);
按钮[i].setPreferredSize(新尺寸(100100));
添加(按钮[i]);
}
按钮[0]。设置文本(“2”);
按钮[0]。设置背景(颜色.绿色);
计时器=新计时器(500,事件->{
按钮[currentIndex].setText(“”);
按钮[currentIndex].setBackground(颜色.白色);
currentIndex+=delta;
按钮[currentIndex].setText(“2”);
按钮[currentIndex].setBackground(颜色.绿色);
如果(currentIndex==0 | | currentIndex==3){
timer.stop();
}
});
timer.setInitialDelay(0);
}
@凌驾
已执行的公共无效操作(操作事件e){
国际单项体育联合会(旗){
flag=false;
δ=1;
}
否则{
flag=true;
delta=-1;
}
timer.start();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->{
JFrame JFrame=新JFrame(“网格”);
jFrame.add(newmypanel());
jFrame.pack();
jFrame.setresizeable(false);
jFrame.setVisible(true);
});
}
}

我们想利用计时器。看看这个答案:这是一个可能很快变得复杂的大主题,但简短的版本是所有游戏逻辑都应该在一个单独的线程上完成,该线程使用
invokeAndWait()
invokeLater()
启动一个计时器,该计时器调用UI线程并使用计时器处理颜色变化,这样就不会阻塞用户界面,并且我们可以实现基于颜色的无缝过渡