簡體   English   中英

擴展JButton在鼠標懸停之前無法顯示

[英]Extended JButton fails to appear until Mouse Over

因此,情況是我正在制作一個由8 * 8按鈕組成的面板,例如矩陣,並且我將不得不根據單擊的按鈕的位置更改特定的按鈕文本。 制作自己的JButton似乎是個好主意,在這里我可以為按鈕分配x和y索引,因此我可以輕松地檢查索引是否單擊了按鈕。 這是該代碼:

import javax.swing.JButton;

public class MatrixButton extends JButton {
    private int x;
    private int y;

    public MatrixButton(int x, int y, String text){
        super(text);
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
}

它確實解決了任務,但是這些“矩陣”按鈕直到我將鼠標懸停在它們上之前都不想出現。 可能是什么問題呢?

這是包含這些按鈕並處理其動作的面板代碼:

public class PlayField extends JPanel implements ActionListener {
    private MatrixButton[][] button = new MatrixButton[8][8];

    public PlayField(){
        Random rand = new Random();

        setLayout(new GridLayout(8, 8));

        for (int i = 0; i < 8; ++i){
            for (int j = 0; j < 8; ++j){
                button[i][j] = new MatrixButton(j, i, "" + rand.nextInt(80));
                button[i][j].addActionListener(this);

                add(button[i][j]);
            }
        }
    }

    private String incrementText(MatrixButton mb){
        return "" + (Integer.parseInt(mb.getText()) + 1);
    }

    @Override
    public void actionPerformed(ActionEvent e){
        MatrixButton mb = (MatrixButton)e.getSource();

        for (int i = mb.getY(); i >= 0; --i){
            button[i][mb.getX()].setText(incrementText(button[i][mb.getX()]));
        }
        for (int i = 0; i < 8; ++i){
            if (i != mb.getX())
            button[mb.getY()][i].setText(incrementText(button[mb.getY()][i]));
        }
    }
}

PS:如果我用普通的JButton填充,它們將按原樣顯示。 這就是為什么我感到困惑的原因,因為我在JButton擴展上沒有做太多改變,只是向它添加了2個變量。

這是危險的代碼:

public int getX() {
    return x;
}
public int getY() {
    return y;
}

您確實意識到這將覆蓋JButton的兩個關鍵方法(實際上,這些方法來自JButton的父JComponent),這些方法有助於設置按鈕在GUI上的位置(在方法上方添加@Override可以看到是這樣)。 我強烈建議您更改這些方法的簽名,也許是getGridX()getGridY() ,或者甚至更好,使用合成而不是繼承,因為您會遇到這類問題的風險-不知不覺中覆蓋了關鍵方法- -擴展諸如Swing組件類的復雜類時。 因此,除非絕對必要,否則我將盡量避免擴展這些類。

例如:

import java.awt.GridLayout;
import java.awt.event.*;
import java.util.Random;

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

public class PlayField {
    private static final int ROWS = 8;
    private static final int COLS = ROWS;
    private static final int MAX_RAND = 80;
    private JPanel mainPanel = new JPanel();
    private MatrixButton[][] button = new MatrixButton[ROWS][COLS];

    public PlayField(){
        Random rand = new Random();
        mainPanel.setLayout(new GridLayout(ROWS, COLS));
        for (int i = 0; i < ROWS; ++i){
            for (int j = 0; j < COLS; ++j){
                button[i][j] = new MatrixButton(j, i, rand.nextInt(MAX_RAND));
                button[i][j].addActionListener(new MyMatrixListener(i, j));
                mainPanel.add(button[i][j].getButton());
            }
        }
    }

    private class MyMatrixListener implements ActionListener {
        private int i;
        private int j;

        public MyMatrixListener(int i, int j) {
            this.i = i;
            this.j = j;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i2 = 0; i2 < button.length; i2++) {
                if (i2 != i) {
                    int value = button[i2][j].getValue();
                    value++;
                    button[i2][j].setValue(value);
                }
            }
            for (int j2 = 0; j2 < button[i].length; j2++) {
                if (j2 != j) {
                    int value = button[i][j2].getValue();
                    value++;
                    button[i][j2].setValue(value);
                }
            }
        }
    }

    public JPanel getMainPanel() {
        return mainPanel;
    }

    private static void createAndShowGui() {
        JFrame
        frame = new JFrame("PlayField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new PlayField().getMainPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }    
}

class MatrixButton {
    private int column;
    private int row;
    private JButton button = new JButton();
    private int value;

    public MatrixButton(int column, int row, int value) {
        this.column = column;
        this.row = row;
        setValue(value);
    }

    public void addActionListener(ActionListener listener) {
        button.addActionListener(listener);
    }

    public int getColumn() {
        return column;
    }

    public int getRow() {
        return row;
    }

    public JButton getButton() {
        return button;
    }

    public int getValue() {
        return value;
    }

    public final void setValue(int value) {
        this.value = value;
        button.setText("" + value);
    }
}

最好只使用整數而不是字符串

暫無
暫無

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

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