无法画线(方法:paintComponent)- Java
Can't draw line(method: paintComponent) - Java
我正在尝试在 JFrame
中画一条线,但未画出线。
我尝试将方法 setOpaque(true)
用于 contentPane
、lblNewLabel
和 l
,但没有任何改变。我也尝试在 class 之外调用 repaint();
但情况仍然相同。这是代码:
public class DrawingClass extends JFrame
{
private JPanel contentPane;
public DrawingClass(int n, int s, int p) {
Line l= new Line();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(700, 300, 480, 640);
contentPane = new JPanel();
contentPane.setOpaque(true);
setResizable(false);
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("");
lblNewLabel.setIcon(new ImageIcon("image.png"));
lblNewLabel.setBounds(0, 0, 480, 640);
contentPane.add(lblNewLabel);
l.setBounds(0,0,480,640);
contentPane.add(l);
repaint();
}
class Line extends JPanel
{
public void paintComponent(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(10, 10, 15, 12);
}
}
}
我希望在 JFrame 的左上角、背景墙纸上方有一条小线,但没有任何反应。它只显示壁纸。
您的代码中有几个错误:
您正在扩展 JFrame
但您没有改变它的行为,那么您为什么要这样做? JFrame
是一个刚性组件,因此从它扩展永远不是一个好主意,而是基于 JPanel
构建你的 GUI。参见:Extends JFrame vs. creating it inside the program
不要显式设置 JFrame
的大小,在其上调用 pack()
而是覆盖 JPanel
中的 getPreferredSize
,请参阅: Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
在这种情况下您不需要调用 setOpaque(...)
。
不要使用 null-layout
,它可能会导致 strange errors, because null Layout is Evil and frowned upon
我们无权访问您的图片,因此我们无法测试 ImageIcon
,它也与您的问题无关。但是你应该 load your images as resources
不要显式设置每个元素的边界,这与点(4)有关,你应该使用Layout Manager或它们的组合以获得您想要的 GUI.
不要那样调用repaint()
,它没有任何作用,它应该在你的UI发生变化时重新绘制它。但是,程序开始时没有任何变化。
您没有在 paintComponent(...)
方法中调用 super.paintComponent(...)
,从而破坏了 paint-chain。检查 Tutorial on Custom Painting in Swing 以便您了解如何正确执行此操作
小心,因为 paintComponents(...)
(尾随 s
)不同于 paintComponent(...)
(看你的标题)
所以,在完成上述所有更改之后,我们得到了这个简单的程序:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class DrawingClass {
private JPanel contentPane;
private JFrame frame;
public static void main(String args[]) {
SwingUtilities.invokeLater(() -> new DrawingClass().createAndShowGUI());
}
public void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
Line line = new Line();
frame.add(line);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
class Line extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(10, 10, 15, 12);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(480, 640);
}
}
}
产生以下输出:
我正在尝试在 JFrame
中画一条线,但未画出线。
我尝试将方法 setOpaque(true)
用于 contentPane
、lblNewLabel
和 l
,但没有任何改变。我也尝试在 class 之外调用 repaint();
但情况仍然相同。这是代码:
public class DrawingClass extends JFrame
{
private JPanel contentPane;
public DrawingClass(int n, int s, int p) {
Line l= new Line();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(700, 300, 480, 640);
contentPane = new JPanel();
contentPane.setOpaque(true);
setResizable(false);
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblNewLabel = new JLabel("");
lblNewLabel.setIcon(new ImageIcon("image.png"));
lblNewLabel.setBounds(0, 0, 480, 640);
contentPane.add(lblNewLabel);
l.setBounds(0,0,480,640);
contentPane.add(l);
repaint();
}
class Line extends JPanel
{
public void paintComponent(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(10, 10, 15, 12);
}
}
}
我希望在 JFrame 的左上角、背景墙纸上方有一条小线,但没有任何反应。它只显示壁纸。
您的代码中有几个错误:
您正在扩展
JFrame
但您没有改变它的行为,那么您为什么要这样做?JFrame
是一个刚性组件,因此从它扩展永远不是一个好主意,而是基于JPanel
构建你的 GUI。参见:Extends JFrame vs. creating it inside the program不要显式设置
JFrame
的大小,在其上调用pack()
而是覆盖JPanel
中的getPreferredSize
,请参阅: Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?在这种情况下您不需要调用
setOpaque(...)
。不要使用
null-layout
,它可能会导致 strange errors, because null Layout is Evil and frowned upon我们无权访问您的图片,因此我们无法测试
ImageIcon
,它也与您的问题无关。但是你应该 load your images as resources不要显式设置每个元素的边界,这与点(4)有关,你应该使用Layout Manager或它们的组合以获得您想要的 GUI.
不要那样调用
repaint()
,它没有任何作用,它应该在你的UI发生变化时重新绘制它。但是,程序开始时没有任何变化。您没有在
paintComponent(...)
方法中调用super.paintComponent(...)
,从而破坏了 paint-chain。检查 Tutorial on Custom Painting in Swing 以便您了解如何正确执行此操作小心,因为
paintComponents(...)
(尾随s
)不同于paintComponent(...)
(看你的标题)
所以,在完成上述所有更改之后,我们得到了这个简单的程序:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class DrawingClass {
private JPanel contentPane;
private JFrame frame;
public static void main(String args[]) {
SwingUtilities.invokeLater(() -> new DrawingClass().createAndShowGUI());
}
public void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
Line line = new Line();
frame.add(line);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
class Line extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(10, 10, 15, 12);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(480, 640);
}
}
}
产生以下输出: