gpt4 book ai didi

java - 点击按钮,绘制矩形

转载 作者:行者123 更新时间:2023-12-02 06:32:25 26 4
gpt4 key购买 nike

我是Java新手......我研究了我们可以在框架上添加两个东西......我添加了按钮并通过单击按钮作为响应我想要矩形作为输出......但我不明白那..为什么我没有得到输出......

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

public class customizedgui5 implements ActionListener {

JButton button;

JFrame frame;

public static void main(String[] args) {

customizedgui5 hi = new customizedgui5();

hi.go();
}

public void go() {

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton button = new JButton("click me");

button.addActionListener(this);

myclass a = new myclass();

frame.getContentPane().add(button, BorderLayout.CENTER);

frame.getContentPane().add(a, BorderLayout.SOUTH);

frame.setSize(100, 100);

frame.setVisible(true);

}

public void actionPerformed(ActionEvent event) {

frame.repaint();

frame.revalidate();

}

}

class myclass extends JPanel {

public void paintComponent(Graphics g) {

g.setColor(Color.orange);

g.fillRect(20, 50, 100, 100);

}

}

最佳答案

我首先看一下 Performing Custom Painting .

代码中的主要问题是,当您单击按钮时,您会收到 NullPointerException,因为 frame 的引用为 null

它是null,因为您已经在构造函数中隐藏了它(基本上,在构造函数中声明了另一个同名的变量)...

// I'm null..
JFrame frame;

public void go() {
// Not the same as frame above...
JFrame frame = new JFrame();

由于多种原因,您也不会看到任何变化......

  1. myclass 面板没有大小。使用 BorderLayout,这不会是“太大”的问题,但是......
  2. 您在面板的可见范围之外进行了绘制。您正在绘制的矩形不会出现,因为它是在面板的宽度和高度之外绘制的。
  3. 矩形将在您按下按钮之前出现,因为一旦面板在屏幕上可见,将调用 paintComponent 来更新面板的状态...

您需要做的第一件事是向 BorderLayout 提供某种尺寸提示。尝试添加...

@Override
public Dimension getPreferredSize() {
return new Dimension(120, 150);
}

myclass

你也不需要重新绘制框架,你真正想要重新绘制的是myclass的实例。尝试更新 customizedgui5 以便 a 成为实例变量(如 frame...

//...
myclass a;
//...

public void go() {

//...
a = new myclass();
//...

}

public void actionPerformed(ActionEvent event) {
a.repaint();
}

现在,当面板在屏幕上可见时,矩形仍将显示。当然,您可以尝试将其设置为不可见,但这会影响框架的布局,从而隐藏您的组件,因此,我们需要某种可以触发的标志,以便我们知道何时绘制矩形。这可以通过使用简单的 boolean 变量轻松实现,例如...

class myclass extends JPanel {

private boolean paintRect;

public void setPaintRect(boolean paint) {
paintRect = paint;
repaint();
}

@Override
public Dimension getPreferredSize() {
return new Dimension(120, 150);
}

@Override
public void paintComponent(Graphics g) {

super.paintComponent(g);

if (paintRect) {
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
}

}
}

然后在您的actionPerformed方法中,您只需设置标志...

public void actionPerformed(ActionEvent event) {
a.setPaintRect(true);
}

您可能还想阅读Code Conventions for the Java Programming Language 。这将使人们更容易阅读您的代码...

关于java - 点击按钮,绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com