#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. Хорошо, спасибо! Но почему кнопка переходит в правильное место при наведении курсора мыши?