Ale*_*lex 15 java user-interface swing awt jpanel
我从这里得到了一些有趣的想法和批评,这篇和这篇文章(参见上一篇关于GUI代码的帖子).尽管如此,我仍然对某些事情感到困惑.主要是,显示用户引入图形的最便宜的方式是什么?
更具体而言,我使用了paintComponent()从方法JPanel通过使这个类的一个对象中的类MouseDragged()与方法一起paintComponent(getGraphics())方法(AuxClass2和AuxClass1相应地).
显然,使用getGraphics()而paintComponent()不是repaint()坏主意,我怀疑与内存使用有关.AuxClass2每次用户拖动鼠标时调用也是一个坏主意.
JPanel vs Canvas(即swing vs awt)也有点令人困惑.使用什么以及何时使用?
我一直试图找到一个解决方法,但没有找到一个,特别是对于getGraphics()方法:如何将图形添加到面板?
Mad*_*mer 20
基本上,重量级组件与其自己的本地对等体相关联,其中轻量级组件共享共同的本地对等体.
一般来说,混合重量和重量轻的组件并不是一个好主意,因为z-order存在问题,而且根据我的经验(即使它现在应该更好),可能会出现绘画问题.
这就是为什么你不鼓励使用这个Canvas课程的原因,可能是因为你试图将它放在一个轻量级组件上......我猜
对于Swing API的新手来说,最大的问题之一就是你对绘画过程有某种控制的错觉,你不这样做.接受它更容易.
您可以做的最好的事情是请求重绘管理器尽早执行更新.
此外,getGraphics不保证调用返回非空值.
paint VS paintComponent
这里的问题是paint做了许多重要的工作,打电话paintComponent只是其中之一.
在Swing中,我们非常鼓励paintComponent在我们想要执行自定义绘制时使用它,这通常是组件上的最低级别,并且在绘制子组件之前调用.
如果你覆盖paint然后画上画,那么Graphics在super.paint你调用之后最终会在所有东西上画画,这并不总是理想的结果
即使是这样,子组件也可以独立于其父容器进行绘制,使涂料"覆盖"您可能添加的任何涂料效果
有用的链接
分手的想法
只有实际添加到组件的组件(连接到本机对等方)才会有paint调用方法.因此,尝试绘制到尚未添加到容器中的组件却是毫无意义的......
..paintbrush-type GUI ..
使用a BufferedImage作为绘画表面.在一个显示它JLabel.将标签放在a内的面板中央JScrollPane.
bufferedImage.getGraphics()根据需要打电话,但完成后请记住dispose(),然后打电话label.repaint().
始终使用Swing组件,不要覆盖任何内容.
以下是使用图像作为绘画表面的示例.

而这里是一个更好的!

我没有说屏幕截图更好,代码更好.;)
我一直试图找到一个解决方法,但没有找到一个,特别是对于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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
另见http://docs.oracle.com/javase/tutorial/uiswing/painting/
| 归档时间: |
|
| 查看次数: |
29668 次 |
| 最近记录: |