有人能告诉我为什么矩形没有出现在画面上吗?
我只在框架上看到一个按钮。请帮忙。
我尝试使用paint
方法绘制矩形。
我应该使用paintComponent()
还是只使用paint()
?
public class GUI2 {
public static void main(String[] args) {
JFrame frame = new JFrame("Game");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocation(500, 200);
JPanel panel = new JPanel();
frame.add(panel);
JButton button = new JButton("YO");
panel.add(button);
button.addActionListener(new Action());
frame.paint(null);
}
public void paint(Graphics g) {
g.drawRect(250, 250, 200, 100);
}
static class Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
}
答案 0 :(得分:4)
paint
paint
方法JPanel
课程paintComponent
班级JPanel
super.paintComponent
方法调用paintComponent
。JPanel
添加到JFrame
main
内部执行任何操作,因为您会发现static
会导致问题。在构造函数中执行所有操作SwingUtilitites.invokeLater()
运行该程序。ActionListener
setVisible
应该是你做的最后一件事。JFrame
添加多个组件时,您需要使用BorderLayout
位置,或将布局设置为JFrame
除BorderLayout
以外的其他内容getPrefferedSize
中的JPanel
,因此JPanel
具有受尊重的首选尺寸。JFrame
只调用pack();
以下是代码的重构
另见Creating GUI with Swing | Graphics2D | Performing Custom Paintin了解更多详情。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class GUI2 {
JButton button = new JButton("YO");
public GUI2() {
button.addActionListener(new Action());
JFrame frame = new JFrame("Game");
frame.add(new DrawPanel(), BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private class DrawPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(250, 250, 200, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GUI2();
}
});
}
static class Action implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
}
答案 1 :(得分:2)
我可以告诉你为什么你会得到NullPointerException
Graphics
方法传递有效paint
上下文,但我会以任何方式阻止此@Override
注释,这会阻止该类编译。当你认为你正在覆盖父类的方法时会使用它,它会告诉你什么时候出错首先看一下Performing Custom Painting,然后看一下Painting in AWT and Swing,了解有关如何在Swing中实际绘画的详细信息
答案 2 :(得分:0)
以下是您的代码的工作示例:
package test;
import javax.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;
import java.awt.*;
import java.text.AttributedCharacterIterator;
public class GUI2 extends JPanel{
JButton button;
JFrame frame;
public GUI2() {
button = new JButton("YO");
//panel = new JPanel();
frame = new JFrame();
//panel = new JPanel();
this.add(button);
frame.add(this);
//button.addActionListener(new Action());
// this.paint(null);
frame.setSize(500, 500);
frame.setLocation(500, 200);
frame.setVisible(true);
}
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawRect(250, 250, 200, 100);
}
public static void main(String[] args) {
GUI2 test = new GUI2();
}
}
我删除了一些语句,但您可以稍后添加