我从this,this和this帖子中得到了一些有趣的想法和批评(请参阅上一篇文章,了解相关GUI的代码)。尽管如此,我仍然对某些事情感到困惑。主要是,显示用户引入图形的最便宜的方式是什么?
更具体地说,我使用paintComponent()
类中的JPanel
方法,通过MouseDragged()
方法和paintComponent(getGraphics())
方法({{1})创建此类的对象}和AuxClass2
相应的。)
显然,使用AuxClass1
和getGraphics()
代替paintComponent()
是不好的想法,我怀疑与内存使用有关。每次用户拖动鼠标时调用repaint()
也是一个坏主意。
JPanel vs Canvas(即swing vs awt)也有点令人困惑。使用什么以及何时使用?
我一直在努力寻找解决方法,但是没有找到解决办法,特别是对于AuxClass2
方法:如何将图形添加到面板中?
答案 0 :(得分:20)
基本上讲,一个重量级组件与其自己的本地对等体相关联,其中轻量级组件共享一个共同的本地对等体。
一般来说,混合重量和重量轻的组件不是一个好主意,因为z顺序存在问题,而且根据我的经验(尽管现在应该更好),可能会出现绘画问题。
这就是为什么你不鼓励使用Canvas
课程的原因,可能是因为你试图将它放在一个轻量级组件上......我想
对Swing API的新人来说,最大的问题之一就是你对绘画过程有某种控制的错觉,你不这样做。接受它会更容易。
您可以做的最好的事情是请求重绘经理尽早执行更新。
此外,不能保证调用getGraphics
返回非空值。
paint
vs paintComponent
这里的问题是paint
执行了许多重要的工作,调用paintComponent
只是其中之一。
在Swing中,我们非常鼓励每当我们想要执行自定义绘制时使用paintComponent
,这通常是组件的最低级别,并在绘制子组件之前调用。
如果您覆盖paint
,然后在调用Graphics
之后在super.paint
上画画,您将最终在所有内容上绘画,这并不总是理想的结果
即使它是,也可以独立于父容器绘制子组件,使涂料“覆盖”您可能添加的任何颜色效果
有用的链接
分手思考
只有实际添加到组件的组件(连接到本机对等方)才会调用paint
方法。因此,尝试绘制到尚未添加到容器中的组件却是毫无意义的......
答案 1 :(得分:9)
..画笔式GUI ..
使用BufferedImage
作为绘画表面。在JLabel
中显示。将标签放在JScrollPane
内的面板中央。
根据需要致电bufferedImage.getGraphics()
,但请在完成后记得dispose()
,然后致电label.repaint()
。
全程使用Swing组件,不要覆盖任何内容。
这是example of using an image as painting surface。
我没有说 屏幕截图 更好,代码更好。 ;)
答案 2 :(得分:7)
我一直在努力寻找解决方法,但还没找到, 特别是对于getGraphics()方法:图形怎么样 添加到面板?
您记得需要将哪些内容绘制为变量并在paintComponent()中使用它。 例如,您在其他问题中尝试做的事情如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PaintRectangle extends JPanel {
private Point mouseLocation;
public PaintRectangle() {
setPreferredSize(new Dimension(500, 500));
MouseAdapter listener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
updateMouseRectangle(e);
}
private void updateMouseRectangle(MouseEvent e) {
mouseLocation = e.getPoint();
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
updateMouseRectangle(e);
}
@Override
public void mouseReleased(MouseEvent e) {
mouseLocation = null;
repaint();
}
};
addMouseListener(listener);
addMouseMotionListener(listener);
}
private Rectangle getRectangle() {
if(mouseLocation != null) {
return new Rectangle(mouseLocation.x - 5, mouseLocation.y - 5, 10, 10);
}
else {
return null;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle rectangle = getRectangle();
if(rectangle != null) {
Graphics2D gg = (Graphics2D) g;
gg.setColor(Color.BLUE);
gg.fill(rectangle);
gg.setColor(Color.BLACK);
gg.draw(rectangle);
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new PaintRectangle());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}