每次按下按钮时,我都试图更改 JPanel 的背景颜色
I'm trying to change the background color of a JPanel each time a button is pressed
我已经查看了几个类似的问题,但未能解决这个问题。我正在显示时间并添加了一个计数到 4 并重新开始的计数器,但我只能让它设置开始背景颜色。我在这里错过了什么?我试过将我的 if 语句放在几个地方。除了颜色变化之外的一切都工作正常。
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TimeFrame extends JFrame {
private static final int FRAME_WIDTH = 250;
private static final int FRAME_HEIGHT = 200;
private JButton CurrentTime;
private JLabel CurrentTimeLabel;
private JTextField CurrentTimeField;
private int click;
private JTextField clicktest;
public TimeFrame() {
CurrentTimeLabel = new JLabel("The Current Time is: ");
createTextField();
createButton();
createPanel();
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setSize(250, 200);
initialize();
}
private void initialize()
{
click = 0;
}
private void createTextField()
{
final int FIELD_WIDTH = 10;
CurrentTimeField = new JTextField(FIELD_WIDTH);
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
CurrentTimeField.setText("" + dateFormat.format(now));
clicktest = new JTextField(FIELD_WIDTH);
clicktest.setText(" " + click);
}
private void createButton()
{
CurrentTime = new JButton("Display Current Time");
ActionListener listener = new AddCurrentTimeListener();
CurrentTime.addActionListener(listener);
}
private void createPanel()
{
JPanel panel = new JPanel();
//panel.addActionListener(backgroundListener);
panel.add(CurrentTimeLabel);
panel.add(CurrentTimeField);
panel.add(CurrentTime);
panel.add(clicktest);
//int click = 0;
if (click == 0){
panel.setBackground(Color.ORANGE);
}
else if (click == 1) {
panel.setBackground(Color.YELLOW);
}
else if (click == 2) {
panel.setBackground(Color.BLUE);
}
else if (click == 3) {
panel.setBackground(Color.GREEN);
}
else if (click == 4) {
panel.setBackground(Color.PINK);
}
add(panel);
}
class AddCurrentTimeListener implements ActionListener
{
public void actionPerformed(ActionEvent event){
new java.util.Date();
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
CurrentTimeField.setText("" + dateFormat.format(now));getClass();
if (click < 4){
click++;
} else {
click = click - 4;}
clicktest.setText("" + click);getClass();
/**
if (click == 0){
panel.setBackground(Color.ORANGE);
}
else if (click == 1) {
panel.setBackground(Color.YELLOW);
}
else if (click == 2) {
panel.setBackground(Color.BLUE);
}
else if (click == 3) {
panel.setBackground(Color.GREEN);
}
else if (click == 4) {
panel.setBackground(Color.PINK);
}
*/
repaint();
}
}
}
通过向框架添加 JPanel
,您有效地阻止了框架 contentPane
,这本身并不是一个特定的问题,除了在您的 ActionListener
,您正在尝试设置框架本身的背景颜色。
现在,这不起作用,因为框架由许多重叠的组件组成。
不会显示对框架背景的任何更改,因为它隐藏在 contentPane
后面。
相反,您应该更改 contentPane
的背景。
好的,但这又把我们带回了第一个问题(JPanel
)。现在,您可以使 JPanel
成为一个实例字段并在 ActionListener
中更改它的背景颜色,这样就可以了,或者您可以去掉它并简单地更改框架的 contentPane
,这你选择由你决定
对于我这个过于简化的示例,我选择简单地使用框架的 contentPane
,因为它展示了一个您需要了解框架的重要概念...
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class TimeFrame extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TimeFrame().setVisible(true);
}
});
}
private JButton currentTime;
private JLabel currentTimeLabel;
private JTextField currentTimeField;
private int click;
private JTextField clicktest;
public TimeFrame() {
currentTimeLabel = new JLabel("The Current Time is: ");
createTextField();
createButton();
createPanel();
pack();
setLocationRelativeTo(null);
initialize();
}
private void initialize() {
click = 0;
}
private void createTextField() {
final int FIELD_WIDTH = 10;
currentTimeField = new JTextField(FIELD_WIDTH);
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
currentTimeField.setText("" + dateFormat.format(now));
clicktest = new JTextField(FIELD_WIDTH);
clicktest.setText(" " + click);
}
private void createButton() {
currentTime = new JButton("Display Current Time");
ActionListener listener = new AddCurrentTimeListener();
currentTime.addActionListener(listener);
}
private void createPanel() {
setLayout(new FlowLayout());
//panel.addActionListener(backgroundListener);
add(currentTimeLabel);
add(currentTimeField);
add(currentTime);
add(clicktest);
}
class AddCurrentTimeListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
new java.util.Date();
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
currentTimeField.setText("" + dateFormat.format(now));
getClass();
if (click < 4) {
click++;
} else {
click = click - 4;
}
clicktest.setText("" + click);
if (click == 0) {
getContentPane().setBackground(Color.ORANGE);
} else if (click == 1) {
getContentPane().setBackground(Color.YELLOW);
} else if (click == 2) {
getContentPane().setBackground(Color.BLUE);
} else if (click == 3) {
getContentPane().setBackground(Color.GREEN);
} else if (click == 4) {
getContentPane().setBackground(Color.PINK);
}
repaint();
}
}
}
免责声明:
就个人而言,我会避免直接从 JFrame
扩展,它会将您锁定在一个用例中并使您依赖框架的功能(例如必须使用 getContentPane
)
就个人而言,我会从 JPanel
开始,然后将其添加到我想要的每个容器中
我已经查看了几个类似的问题,但未能解决这个问题。我正在显示时间并添加了一个计数到 4 并重新开始的计数器,但我只能让它设置开始背景颜色。我在这里错过了什么?我试过将我的 if 语句放在几个地方。除了颜色变化之外的一切都工作正常。
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TimeFrame extends JFrame {
private static final int FRAME_WIDTH = 250;
private static final int FRAME_HEIGHT = 200;
private JButton CurrentTime;
private JLabel CurrentTimeLabel;
private JTextField CurrentTimeField;
private int click;
private JTextField clicktest;
public TimeFrame() {
CurrentTimeLabel = new JLabel("The Current Time is: ");
createTextField();
createButton();
createPanel();
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setSize(250, 200);
initialize();
}
private void initialize()
{
click = 0;
}
private void createTextField()
{
final int FIELD_WIDTH = 10;
CurrentTimeField = new JTextField(FIELD_WIDTH);
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
CurrentTimeField.setText("" + dateFormat.format(now));
clicktest = new JTextField(FIELD_WIDTH);
clicktest.setText(" " + click);
}
private void createButton()
{
CurrentTime = new JButton("Display Current Time");
ActionListener listener = new AddCurrentTimeListener();
CurrentTime.addActionListener(listener);
}
private void createPanel()
{
JPanel panel = new JPanel();
//panel.addActionListener(backgroundListener);
panel.add(CurrentTimeLabel);
panel.add(CurrentTimeField);
panel.add(CurrentTime);
panel.add(clicktest);
//int click = 0;
if (click == 0){
panel.setBackground(Color.ORANGE);
}
else if (click == 1) {
panel.setBackground(Color.YELLOW);
}
else if (click == 2) {
panel.setBackground(Color.BLUE);
}
else if (click == 3) {
panel.setBackground(Color.GREEN);
}
else if (click == 4) {
panel.setBackground(Color.PINK);
}
add(panel);
}
class AddCurrentTimeListener implements ActionListener
{
public void actionPerformed(ActionEvent event){
new java.util.Date();
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
CurrentTimeField.setText("" + dateFormat.format(now));getClass();
if (click < 4){
click++;
} else {
click = click - 4;}
clicktest.setText("" + click);getClass();
/**
if (click == 0){
panel.setBackground(Color.ORANGE);
}
else if (click == 1) {
panel.setBackground(Color.YELLOW);
}
else if (click == 2) {
panel.setBackground(Color.BLUE);
}
else if (click == 3) {
panel.setBackground(Color.GREEN);
}
else if (click == 4) {
panel.setBackground(Color.PINK);
}
*/
repaint();
}
}
}
通过向框架添加 JPanel
,您有效地阻止了框架 contentPane
,这本身并不是一个特定的问题,除了在您的 ActionListener
,您正在尝试设置框架本身的背景颜色。
现在,这不起作用,因为框架由许多重叠的组件组成。
不会显示对框架背景的任何更改,因为它隐藏在 contentPane
后面。
相反,您应该更改 contentPane
的背景。
好的,但这又把我们带回了第一个问题(JPanel
)。现在,您可以使 JPanel
成为一个实例字段并在 ActionListener
中更改它的背景颜色,这样就可以了,或者您可以去掉它并简单地更改框架的 contentPane
,这你选择由你决定
对于我这个过于简化的示例,我选择简单地使用框架的 contentPane
,因为它展示了一个您需要了解框架的重要概念...
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class TimeFrame extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TimeFrame().setVisible(true);
}
});
}
private JButton currentTime;
private JLabel currentTimeLabel;
private JTextField currentTimeField;
private int click;
private JTextField clicktest;
public TimeFrame() {
currentTimeLabel = new JLabel("The Current Time is: ");
createTextField();
createButton();
createPanel();
pack();
setLocationRelativeTo(null);
initialize();
}
private void initialize() {
click = 0;
}
private void createTextField() {
final int FIELD_WIDTH = 10;
currentTimeField = new JTextField(FIELD_WIDTH);
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
currentTimeField.setText("" + dateFormat.format(now));
clicktest = new JTextField(FIELD_WIDTH);
clicktest.setText(" " + click);
}
private void createButton() {
currentTime = new JButton("Display Current Time");
ActionListener listener = new AddCurrentTimeListener();
currentTime.addActionListener(listener);
}
private void createPanel() {
setLayout(new FlowLayout());
//panel.addActionListener(backgroundListener);
add(currentTimeLabel);
add(currentTimeField);
add(currentTime);
add(clicktest);
}
class AddCurrentTimeListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
new java.util.Date();
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
currentTimeField.setText("" + dateFormat.format(now));
getClass();
if (click < 4) {
click++;
} else {
click = click - 4;
}
clicktest.setText("" + click);
if (click == 0) {
getContentPane().setBackground(Color.ORANGE);
} else if (click == 1) {
getContentPane().setBackground(Color.YELLOW);
} else if (click == 2) {
getContentPane().setBackground(Color.BLUE);
} else if (click == 3) {
getContentPane().setBackground(Color.GREEN);
} else if (click == 4) {
getContentPane().setBackground(Color.PINK);
}
repaint();
}
}
}
免责声明:
就个人而言,我会避免直接从 JFrame
扩展,它会将您锁定在一个用例中并使您依赖框架的功能(例如必须使用 getContentPane
)
就个人而言,我会从 JPanel
开始,然后将其添加到我想要的每个容器中