【问题标题】:Extended JButton fails to appear until Mouse Over扩展的 JButton 直到鼠标悬停才出现
【发布时间】:2017-06-13 21:06:35
【问题描述】:

所以情况是我正在制作一个充满 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:如果我用普通的 JButtons 填充,它们会显示为应有的样子。这就是为什么我很困惑,因为我对 JButton 扩展没有太大的改变,只是增加了 2 个变量。

【问题讨论】:

    标签: java swing jbutton


    【解决方案1】:

    这是危险代码:

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

    您确实意识到这会覆盖 JButton 的两个关键方法(实际上,这些方法来自 JButton 的父级 JComponent),它们有助于设置按钮在 GUI 上的位置(在方法上方添加 @Override 以查看这是所以)。我强烈建议您更改这些方法的签名,也许是getGridX()getGridY(),或者更好的是,使用组合而不是继承,因为您会遇到这类问题的风险——不知不觉地覆盖了关键方法—— - 当您扩展 complex 类时,例如 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);
        }
    }
    

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

    【讨论】:

    • 嗯,谢谢,它实际上覆盖了它,听起来很糟糕,谢谢你的警告。我正在尝试将一个新类作为一个组合,但作为一个组合我只能将这个类的 JButton 组件添加到 JPanel,然后我就无法再达到这个类的索引了。还是我错了?
    • @geri:检查编辑。您可以使用适当的方法(例如 getter 方法)访问任何内容。
    • 感谢您的帮助。我真的很感激,主要问题实际上是我覆盖了 getX 和 getY 方法,我在我的原始 JButton 扩展上更改了方法名称,它们出现了。您包含的这段代码对最终解决方案有很大帮助。谢谢:)
    • @geri:是的,我在回答开头提到了主要问题。是的
    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 2013-07-27
    • 2014-10-10
    • 2020-06-29
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多