当前位置: 首页 > 知识库问答 >
问题:

如何在Java中显示上次点击的按钮的颜色?

相诚
2023-03-14

重新启动应用程序时,必须显示上次显示的颜色。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io. *;

public class The extends JFrame {
    private JButton st1=new JButton("26");

    public The() {
        JPanel panel=new JPanel();
        panel.add(st1);
        st1.addActionListener(new Ac());
        add(panel);
    }

    class Ac implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
            if (((Component)source).getBackground().equals(Color.red)){
                ((Component)source).setBackground(null); //the color changing
            } else {
                ((Component)source).setBackground(Color.red);
            }
            try { //Here I threw the state of the button into color1.txt. The color of the button
                FileOutputStream f = new FileOutputStream("color1.txt");
                ObjectOutputStream out = new ObjectOutputStream(f);
                out.writeObject(st1);
                System.out.println("File has been writen");
                out.close();
            } catch (IOException o) {
        }
    }

    public static void main(String[] args) throws IOException {
        The window = new The();
        window.setVisible(true);
        window.setSize(400,600);
        FileInputStream fileInputStream = new FileInputStream("color1.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
    }
}

现在您需要在重新启动窗口时显示关闭前的颜色。也就是说,如果按钮的颜色为红色,则显示为红色。如果按钮的颜色正常,则显示正常颜色。

共有1个答案

空英达
2023-03-14

首先是代码,然后是解释。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class The extends WindowAdapter implements ActionListener, Runnable {
    private static final String  PATH = "color1.dat";

    private Color  defaultBackground;
    private JButton  st1;
    private JFrame  frame;

    @Override // java.awt.event.ActionListener
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        if (source == st1) {
            Color col = st1.getBackground();
            if (col == defaultBackground) {
                st1.setBackground(Color.red);
            }
            else {
                st1.setBackground(defaultBackground);
            }
        }
    }

    @Override // java.lang.Runnable
    public void run() {
        createAndDisplayGui();
    }

    @Override // java.awt.event.WindowAdapter
    public void windowClosing(WindowEvent event) {
        Color background = st1.getBackground();
        try (FileOutputStream fos = new FileOutputStream(PATH);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(background);
        }
        catch (IOException xIo) {
            throw new RuntimeException("Failed to save button background.", xIo);
        }
    }

    private void createAndDisplayGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addWindowListener(this);
        st1 = new JButton("26");
        st1.addActionListener(this);
        defaultBackground = st1.getBackground();
        init();
        JPanel panel = new JPanel();
        panel.add(st1);
        frame.add(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void init() {
        try (FileInputStream fis = new FileInputStream(PATH);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            Object obj = ois.readObject();
            if (obj instanceof Color) {
                Color bg = (Color) obj;
                st1.setBackground(bg);
            }
        }
        catch (FileNotFoundException xFileNotFound) {
            // Ignore.
        }
        catch (ClassNotFoundException | IOException x) {
            throw new RuntimeException("Failed to read saved background", x);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new The());
    }
}
  • 在methodmain中,我显式启动事件调度线程(EDT)。方法invokelater的参数是实现接口java.lang.Runnable的类的实例(该类执行)。因此,方法invokelater将调用类the中的方法run
  • 方法run(在类中)调用方法createanddisplaygui。在此方法中,我构建了GUI。
  • 方法createanddisplayGui调用方法init。方法init尝试读取存储st1的最后一个背景色的文件(即JButton)。注意,代码使用了try-with-resources和multi-catch。还要注意,第一次运行应用程序时,文件可能不存在。因此,我忽略FileNotFoundException
  • 您只想在退出应用程序时保存st1的背景颜色。因此,我添加了一个windowlistener。在JFrame关闭之前调用WindowClosing方法。
 类似资料:
  • Javascript(jQuery)代码 HTML/EJS代码 我读过的一些不起作用的帖子: 如何在单击按钮时通过动画显示视图? 尝试在单击按钮时显示div

  • 链接到我正在尝试刮取的页面: https://www.nytimes.com/reviews/dining 因为这个页面有一个“show more”按钮,所以我需要Selenium自动反复单击“show more”按钮,然后以某种方式使用Beauty soup来获取页面上每个餐厅评论的链接。在下面的照片中,我想获取的链接位于https://...onigiri.html" 迄今为止的代码: 我如何

  • 当按钮单击时,是否有任何机制显式地触发按键事件。当我单击java UI中命名为“+”的按钮时,它将显式地触发“+”键按下事件。

  • 我一直在TkinterGUI上工作,而且是新手。现在我想使用Opencv显示一个图像,在一个单独的窗口中单击按钮,因此首先我使用askopenfilename()获取图像路径,然后将该值传递给cv2。下面是imread()代码。 图像显示在一个新窗口中,但当我试图关闭它时,Tkinter应用程序也会关闭。我需要在图像上执行一些任务,然后在不影响Tkinter应用程序的情况下按键关闭它。它可以用线程

  • 我正在使用javascript(extensions chrome)在程序“Atom”中制作一个机器人,并希望点击按钮“添加到购物车”。我的html是。我猜我在使用值时需要这样做。怎么做?

  • 我有2. fxml文件(stage1.fxml和stage2.fxml)和它的控制器类。 我在第一阶段有一个按钮。打开stage2的fxml。fxml单击时,上面有以下代码: 这可以很好地打开阶段2,但是阶段1仍然是打开的,我可以直接用tab键进入它并仍然使用该阶段中的按钮,我不想这样。 我怎么能。在打开stage2之前,当我按下bInstage2时,设置stage1可见(false)。fxml?