【问题标题】:Giving one JButton two different actions给一个 JButton 两个不同的动作
【发布时间】:2013-05-22 09:00:47
【问题描述】:

我对 java 很陌生,不知道我可以使用哪些方法来实现我想要做的事情。 我需要制作一个模拟电灯开关的程序。一个按钮可以打开和关闭灯。我在触发事件之前将背景颜色设置为深灰色,在触发事件之后将背景颜色设置为黄色。我遇到的问题是当背景为黄色时,如何使用相同的按钮将其更改回深灰色?

我的代码:

import javax.swing.JApplet;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Question2 extends JApplet implements ActionListener {
    public void init() {
        Container contentPane = getContentPane();
        contentPane.setBackground(Color.DARK_GRAY);

        contentPane.setLayout(new FlowLayout());

        JButton OnOffSwitch = new JButton("On/Off");
        contentPane.add(OnOffSwitch);
        OnOffSwitch.addActionListener(this);    
    }

    public void actionPerformed(ActionEvent e) {
        Container contentPane = getContentPane();

        if (e.getActionCommand().equals("On/Off"))
            contentPane.setBackground(Color.YELLOW);
        else 
            contentPane.setBackground(Color.DARK_GRAY);
    }
}

【问题讨论】:

  • “一个开关灯的按钮。”为此使用JToggleButtonJCheckBox
  • JApplet 为什么要编写小程序?如果是由于规范。老师请发给Why CS teachers should stop teaching Java applets
  • 虽然布尔值是要走的路(更好的是,遵循@andrew 的建议),但您自己实际上是在正确的道路上。除了将标签设置为On/Off,您还可以使用Turn On 对其进行初始化,如果发现它等于actionPerformed,则将颜色更改为黄色并将新标签设置为Turn Off。不过不建议使用它,这只是为了您的知识:)

标签: java swing jbutton japplet


【解决方案1】:

例如(使用来自this answer 的图片)。

import java.awt.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;

class ToggleButtons {

    public static void main(String[] args) throws Exception {
        URL offUrl = new URL("http://i.stack.imgur.com/gJmeJ.png");
        URL onUrl = new URL("http://i.stack.imgur.com/5v2TX.png");
        final Image offImg = ImageIO.read(offUrl);
        final Image onImg = ImageIO.read(onUrl);
        Runnable r = new Runnable() {

            @Override
            public void run() {
                int s = 5;
                JPanel gui = new JPanel(new GridLayout(s, s));
                Icon offIcon = new ImageIcon(offImg);
                Icon onIcon = new ImageIcon(onImg);

                for (int ii=0; ii<s*s; ii++) {
                    JToggleButton tb = new JToggleButton(offIcon, ii%2==0);
                    tb.setSelectedIcon(onIcon);
                    gui.add(tb);
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • +1 用于通过URL 访问图像;另请参阅相关的example
【解决方案2】:

将名为onboolean 字段设置为false

boolean on = false;

在你的actionPerformed 中有一个类似这样的翻转逻辑

public void actionPerformed(ActionEvent e)
{
    Container contentPane = getContentPane();

    if (!on) {
            contentPane.setBackground(Color.YELLOW);
            on = true;
    }
    else  {
        contentPane.setBackground(Color.DARK_GRAY);
        on = false;
    }
}

【讨论】:

  • 所以你已经描述了一个 JToggleButton 或 JCheckedBox
  • OP 询问了JButton 的情况下如何处理,对不起,我不明白这个
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2016-08-31
  • 2011-12-19
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多