簡體   English   中英

為什么我不能更改 JButton(禁用)文本顏色?

[英]Why can't I change the JButton (disabled) text color?

我開始編程 Java。 這是我的第一個 window 應用程序。 我做了一個簡單的井字游戲,我希望“o”按鈕的字體顏色是不同的顏色。 但它不起作用。 我可以更改背景顏色,但不能更改 fonts,為什么?

package moje;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.print.PrinterJob;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JTextField;

public class Kolko_i_krzyzyk extends JFrame implements ActionListener {
    
    static JTextField tekst;
    static JLayeredPane ekran = new JLayeredPane();
    static JButton button = new JButton();
    static int licznik=0;

    
    public Kolko_i_krzyzyk () {
        super("Kółko i krzyżyk");
        ekran = new JLayeredPane();
        setVisible(true);
        setSize(800, 800);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        
        //Siatka podzielona 3 na 3
        setLayout(new GridLayout(3,3));
        
        //Tworzenie 9 przycisków
        for(int i = 1; i<=9; i++) {
        JButton button = new JButton();
        add(button);
        button.addActionListener(this);
        }
    }

    public static void main(String[] args) {
        JFrame okno = new Kolko_i_krzyzyk();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    JButton  button = (JButton) e.getSource();
    if(licznik%2==0 ) {
        button.setText("x");
        button.setFont(new Font ("Arial", Font.BOLD, 90));
    }
    else {
        button.setText("O");
        button.setForeground(Color.RED);
        button.setFont(new Font ("Arial", Font.BOLD, 90));
    }
    button.setEnabled(false);
    licznik++;
    }
}
    

這里的問題是通過setEnabled(false)禁用JButton時的默認行為。 這將使按鈕變灰並忽略您對文本(前景)所做的任何顏色格式。

有幾種解決方法可以修改此行為(如在此類似問題中所見)。

這是一個簡短的演示(當然沒有最終的游戲邏輯),它通過setUI()更改JButton的 UI。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.plaf.metal.MetalButtonUI;

public class Test {

    private int counter = 0;

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> new Test().buildGui());
    }

    private void buildGui() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.add(panel);
        panel.setLayout(new GridLayout(3, 3));

        for (int i = 1; i <= 9; i++) {
            JButton button = new JButton() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(150, 150);
                }
            };
            button.setFont(new Font("Arial", Font.BOLD, 90));
            panel.add(button);
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (counter % 2 == 0) {
                        button.setText("X");
                        button.setUI(new MetalButtonUI() {
                            // override the disabled text color for the button UI
                            protected Color getDisabledTextColor() {
                                return Color.BLUE;
                            }
                        });
                    } else {
                        button.setText("O");
                        button.setUI(new MetalButtonUI() {
                            protected Color getDisabledTextColor() {
                                return Color.RED;
                            }
                        });
                    }
                    button.setEnabled(false);
                    counter++;
                }
            });
        }
        frame.pack();
        frame.setVisible(true);
    }

}

結果:

結果

另一種(更簡單)的方法是為“X”和“O”構建一些ImageIcon ,然后通過setIcon() / setDisabledIcon()在按鈕上設置它們。 這樣可以省去修改按鈕 UI 的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM