Подкласс JButton инициализируется в верхнем левом углу JPanel

#java #swing #jbutton

#java #swing #jbutton

Вопрос:

У меня есть матрица кнопок, которые являются подклассом JButton, все в GridLayout в JPanel в JFrame. Первоначально я использовал нулевой макет и setBounds для каждой кнопки, но изменил его на GridLayout после прочтения нескольких сообщений, предполагающих, что нулевые макеты могут вызывать проблемы (оставленный закомментированный код, соответствующий нулевому макету, в коде, вставленном ниже). Эта проблема возникает в обоих макетах. При использовании стандартного JButton вместо моего подкласса проблема не возникает. Пожалуйста, дайте мне знать другую информацию, которую я могу предоставить, которую я, возможно, пропустил. Я просто изучаю Swing, поэтому я уверен, что, вероятно, упускаю что-то очевидное, но я заблудился после поиска решений в Google / поиске на YouTube. Спасибо!

При первоначальном запуске:
Кнопки появляются при наведении курсора мыши

Класс JFrame:

 package com.company;

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

public class swingUI extends JFrame implements ActionListener {
    public static void main(String[] args) {
        new swingUI();
    }

    public swingUI(){

        this.setSize(400,400);

        //this.setLocationRelativeTo(null);

        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension dim = tk.getScreenSize();

        int xPos = (dim.width / 2) - (this.getWidth() / 2);
        int yPos = (dim.height / 2) - (this.getHeight() / 2);

        this.setLocation(xPos, yPos);

        this.setResizable(true);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setTitle("My Frame");

        this.setLayout(null);

        this.addKeypadUI(6,4);
        //this.addDisplay();

        this.setVisible(true);
    }

    private void addKeypadUI(int rows, int cols){
        JPanel panel = new JPanel();
        panel.setBackground(Color.red);
        panel.setBounds(0,0,200,300);
        GridLayout gridLayout = new GridLayout(rows, cols);
        panel.setLayout(gridLayout);
        for (int c = 0; c < rows; c  ) {
            for (int r = 0; r < cols; r  ) {

                KeypadButton button = new KeypadButton(r,c);
                button.setBackground(Color.BLACK);
                //button.setBounds(25 * r   10, 25 * c   10, 20, 20);
                button.setName(String.format("btn_%d_%d",r,c));
                button.addActionListener(this);
                panel.add(button);
            }
        }

        this.add(panel);
    }

//    private void addDisplay(){
//        JLabel jLabel = new JLabel();
//        jLabel.setText("Hello?");
//        jLabel.setForeground(Color.BLACK);
//        jLabel.setBackground(Color.BLACK);
//        jLabel.setBounds(250,20,110,110);
//        this.add(jLabel);
//
//    }

    @Override
    public void actionPerformed(ActionEvent e) {
        KeypadButton o = (KeypadButton) e.getSource();
        String name = o.getName();
        System.out.println(name);
        System.out.println(String.format("x: %d",o.getX()));
        System.out.println(String.format("y: %d",o.getY()));
    }
}
 

Подкласс Button:

 package com.company;

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

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

    KeypadButton(int x, int y){
        this.x = x;
        this.y = y;
    }

    public int getX(){
        return this.x;
    }

    public int getY(){
        return this.y;
    }
}  
 

Ответ №1:

Класс javax.swing.JComponent имеет getX() метод и getY() метод. JButton является подклассом JComponent и поэтому наследует эти методы. Следовательно, ваш KeypadButton класс переопределяет эти методы и возвращает неправильные значения. Вы хотите x быть строкой кнопки в сетке, а y столбцом — столбцом, поэтому просто измените имена методов, даже что-то вроде:

 public int get_X() {
    return this.x;
}

public int get_Y() {
    return this.y;
}
 

Комментарии:

1. Хорошо, спасибо! Но почему кнопка переходит в правильное место при наведении курсора мыши?