java - 向 JFrame 添加多个按钮,文本+颜色未显示

标签 java jbutton actionlistener

我试图将 10 个按钮一个一个地添加到 JPanel,然后将它们全部添加到一个 JFrame。我需要有我的 for 循环,因为它必须很容易改变按钮的数量。所有按钮还需要有不同的颜色和文本(我知道它们可以通过下面的代码获得相同的颜色,但现在没问题)。

我从下面的代码中输出的只是一个带有 10 个白色按钮且没有文本/颜色的框架。为什么 colorstextactionlistener 没有连接到我的按钮?

我读过其他问题,我必须小心我关于 frame.add(panel, frame.pack()frame 的位置.setVisible(true),但我认为这些正确地放置在我的 forloop 之外。我也尝试使用 frame.setContentPane(panel),但这给了相同的结果 - 一个包含 10 个白色按钮且没有文本/颜色的框架。

CMain 类:

public class CMain extends MyButton {
public static void main(String[] args) {

    Random randomGenerator = new Random();
    int numberofbuttons = 10;

    JPanel panel = new JPanel();
    JFrame frame = new JFrame("MyButton testing");

    for (int i = 0; i < numberofbuttons; i++) {

        float r = randomGenerator.nextFloat();float g = randomGenerator.nextFloat();float b = randomGenerator.nextFloat();float r2 = randomGenerator.nextFloat();float g2 = randomGenerator.nextFloat();float b2 = randomGenerator.nextFloat();

        String theText = "SWITCH ME BACK";
        String theOtherText = "button nr: " + i;
        Color theColor = new Color(r, g, b);
        Color theOtherColor = new Color(r2, g2, b2);

        MyButton myb = new MyButton(theColor, theOtherColor, theText, theOtherText);
        panel.add(myb);
    }
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

MyButton 类:

public class MyButton extends JButton implements ActionListener {

private JButton button;
private Color col1;
private Color col2;
private String text1;
private String text2;

public MyButton(Color col1, Color col2, String text1, String text2) {
    this.col1 = col1;
    this.col2 = col2;
    this.text1 = text1;
    this.text2 = text2;
    button = new JButton(text1);
    button.setOpaque(true);
    button.setBackground(col1);
    button.addActionListener(this);
}

public MyButton() {
    this(Color.blue, Color.red, "click = make red", "click = reset to blue");
}

public void ToggleState() {
    Color initialBackground = button.getBackground();

    if (initialBackground == col1) {
        button.setBackground(col2);
        button.setText(text2);
    } else if (initialBackground == col2) {
        button.setBackground(col1);
        button.setText(text1);
    }
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button) {
        this.ToggleState();
    }
}
}

最佳答案

您正在为您的类创建两个 JButton,一个是类本身的对象(this,如果您愿意的话),第二个是 button 类中的 JButton 变量:

public class MyButton extends JButton implements ActionListener {  // **** this is a JButton

    private JButton button; // ***** and so is THIS!

摆脱 button 变量,只使用 this,您的问题可能会得到解决。

public class MyButton extends JButton implements ActionListener {  // this is a JButton

    // private JButton button; // get rid of this
    // and then change all code where you try to use button to this.

例如,

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

public class MyButton extends JButton implements ActionListener {

    // private JButton button;
    private Color col1;
    private Color col2;
    private String text1;
    private String text2;

    public MyButton(Color col1, Color col2, String text1, String text2) {

        super(text1);   // *********** also add this **********

        this.col1 = col1;
        this.col2 = col2;
        this.text1 = text1;
        this.text2 = text2;
        // button = new JButton(text1);
        this.setOpaque(true);
        this.setBackground(col1);
        this.addActionListener(this);
    }

    public MyButton() {
        this(Color.blue, Color.red, "click = make red", "click = reset to blue");
    }

    public void ToggleState() {
        Color initialBackground = this.getBackground();

        if (initialBackground == col1) {
            this.setBackground(col2);
            this.setText(text2);
        } else if (initialBackground == col2) {
            this.setBackground(col1);
            this.setText(text1);
        }
    }

    public void actionPerformed(ActionEvent e) {
        // if (e.getSource() == button) {
        this.ToggleState();
        // }
    }
}

关于java - 向 JFrame 添加多个按钮,文本+颜色未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47289802/

相关文章:

java - 为什么我会收到 JDBC 驱动程序警告和 ThreadLocal 错误?

java - 更改 jButtons 的功能是不是糟糕的设计?

java - 我应该在 Swing 中使用 setAction 还是 addActionListener?

Java 图形用户界面 - 一般

java - 如何在Java中使用与其他元素相同的actionListener

java - JButton 操作中的 if 语句存在问题

java - SQLITE_ERROR - SQL 错误或丢失数据库(接近 "AUTOINCREMENT": syntax error)

java - 快速处理数组以进行波形渲染的方法

java - Hibernate 序列 ID 规范

java - JButton 的对齐问题