如何获得按钮的正确位置? (Java, J按钮)
How can I get the correct position of a button? (Java, JButton)
我创建了一个带有面板的简单框架,它有一个网格布局管理器。当我用重写的 paintComponent(g: Graphics) 方法创建两个自定义按钮时,一个按钮的背景画错了。
我猜这是因为位置总是x=0,y=0。我该如何解决?
按钮代码:
public class JRoundedButton extends JButton {
private int arcRadius;
public JRoundedButton(String label, int arcRadius) {
super(label);
this.setContentAreaFilled(false);
this.arcRadius = arcRadius;
}
@Override
protected void paintComponent(Graphics g) {
if (g instanceof Graphics2D) {
//super.paintComponent(g);
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Draw button background
graphics.setColor(getBackground());
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
//Draw font
this.paintText(graphics);
}
}
protected final void paintText(@NotNull Graphics2D g) {
//Draw font
g.setColor(getForeground());
if (this.getFont() != null && this.getText() != null) {
FontMetrics fm = getFontMetrics(getFont());
g.setColor(this.getForeground());
g.drawString(this.getText(), ((this.getWidth() / 2) - (fm.stringWidth(this.getText()) / 2)),
((this.getHeight() / 2) + fm.getMaxDescent()));
}
}
这是框架创建代码:
public static void main(String[] args) {
JFrame frame = new JFrame("Buttontest");
frame.setSize(new Dimension(500, 500));
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPanel = new JPanel();
contentPanel.setSize(new Dimension(500, 500));
contentPanel.setLayout(new GridLayout(2, 1, 0, 20));
JRoundedButton button1 = new JRoundedButton("Rounded Button", 40);
button1.setForeground(Color.YELLOW);
button1.setBackground(Color.GREEN);
JRoundedButton button2 = new JRoundedButton("Rounded Button 2", 40);
button2.setForeground(Color.WHITE);
button2.setBackground(Color.BLACK);
contentPanel.add(button1);
contentPanel.add(button2);
frame.add(contentPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
如果我执行按钮,上面的按预期显示,但下面的不显示黑色背景。这是为什么?
快速浏览一下,我注意到这是错误的:
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
了解getX()
和getY()
return组件的位置相对于其父组件,通常是您的按钮所在的 JPanel,但这不是您应该绘制的位置。相反,绘图应该位于 相对于按钮本身 的位置。
所以这可能会更好:
graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
我创建了一个带有面板的简单框架,它有一个网格布局管理器。当我用重写的 paintComponent(g: Graphics) 方法创建两个自定义按钮时,一个按钮的背景画错了。
我猜这是因为位置总是x=0,y=0。我该如何解决?
按钮代码:
public class JRoundedButton extends JButton {
private int arcRadius;
public JRoundedButton(String label, int arcRadius) {
super(label);
this.setContentAreaFilled(false);
this.arcRadius = arcRadius;
}
@Override
protected void paintComponent(Graphics g) {
if (g instanceof Graphics2D) {
//super.paintComponent(g);
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Draw button background
graphics.setColor(getBackground());
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
//Draw font
this.paintText(graphics);
}
}
protected final void paintText(@NotNull Graphics2D g) {
//Draw font
g.setColor(getForeground());
if (this.getFont() != null && this.getText() != null) {
FontMetrics fm = getFontMetrics(getFont());
g.setColor(this.getForeground());
g.drawString(this.getText(), ((this.getWidth() / 2) - (fm.stringWidth(this.getText()) / 2)),
((this.getHeight() / 2) + fm.getMaxDescent()));
}
}
这是框架创建代码:
public static void main(String[] args) {
JFrame frame = new JFrame("Buttontest");
frame.setSize(new Dimension(500, 500));
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPanel = new JPanel();
contentPanel.setSize(new Dimension(500, 500));
contentPanel.setLayout(new GridLayout(2, 1, 0, 20));
JRoundedButton button1 = new JRoundedButton("Rounded Button", 40);
button1.setForeground(Color.YELLOW);
button1.setBackground(Color.GREEN);
JRoundedButton button2 = new JRoundedButton("Rounded Button 2", 40);
button2.setForeground(Color.WHITE);
button2.setBackground(Color.BLACK);
contentPanel.add(button1);
contentPanel.add(button2);
frame.add(contentPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
如果我执行按钮,上面的按预期显示,但下面的不显示黑色背景。这是为什么?
快速浏览一下,我注意到这是错误的:
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
了解getX()
和getY()
return组件的位置相对于其父组件,通常是您的按钮所在的 JPanel,但这不是您应该绘制的位置。相反,绘图应该位于 相对于按钮本身 的位置。
所以这可能会更好:
graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);