Java JScrollPane+;画布:渲染问题
我正在开发MS Paint的Java版本。到目前为止,你可以看到它是什么样子。(图片太高,太多,无法嵌入问题) 它使用Java JScrollPane+;画布:渲染问题,java,swing,awt,jscrollpane,repaint,Java,Swing,Awt,Jscrollpane,Repaint,我正在开发MS Paint的Java版本。到目前为止,你可以看到它是什么样子。(图片太高,太多,无法嵌入问题) 它使用JScrollPane移动Canvas的子类。如果不调整窗口的大小,它就可以正常工作。如果您创建了该窗口,乍一看,它的工作方式似乎完全相同 但是,如果您选择,则很明显应用程序正在渲染相同的“视口”,只是移动了。如果你这样做的话,它会变得更加明显,它与其他所有内容重叠 因此,基本上,它渲染了错误的视口。调整窗口大小将更新视口以使其正确。如果你试着画一个灰色区域,它画得很好,你就是看
JScrollPane
移动Canvas
的子类。如果不调整窗口的大小,它就可以正常工作。如果您创建了该窗口,乍一看,它的工作方式似乎完全相同
但是,如果您选择,则很明显应用程序正在渲染相同的“视口”,只是移动了。如果你这样做的话,它会变得更加明显,它与其他所有内容重叠
因此,基本上,它渲染了错误的视口。调整窗口大小将更新视口以使其正确。如果你试着画一个灰色区域,它画得很好,你就是看不见
每当滚动条移动时,我都尝试在画布上执行repaint()
。这没有改变任何事情
我该怎么做才能解决这个问题
这是框架的代码:(参数img
是它将在其上绘制的图像。您必须自己执行setVisible(true)
)
没有正当理由,不要将Swing与AWT组件混用。改为扩展JComponent
没有正当理由,不要将Swing与AWT组件混用。改为扩展
JComponent
用一个变量来构造你的。安德鲁,你能回答这个问题吗?我会检查的,因为它把一切都修好了。非常感谢:请输入D注释作为答案。很高兴你把它整理好了。:)用一个变量来构造你的。安德鲁,你能回答这个问题吗?我会检查的,因为它把一切都修好了。非常感谢:请输入D注释作为答案。很高兴你把它整理好了。:)
import java.awt.*;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
public class JPaint extends JFrame {
JPaintPanel panel;
public JPaint(BufferedImage img) {
super("Edit your image");
panel = new JPaintPanel(img);
setContentPane(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Trial and error got me these numbers.
//I have no idea how find the proper size...
setSize(img.getWidth()+20-1, img.getHeight()+50+50+2);
}
//go to the panel you hold, ask it to retrieve it from the canvas
public BufferedImage grabImage() {
return panel.grabImage();
}
}
class JPaintPanel extends JPanel {
JTools toolbar;
JCanvas canvas;
JScrollPane scrollPane;
public JPaintPanel(BufferedImage img) {
super(new BorderLayout());
toolbar = new JTools();
canvas = new JCanvas(img);
JScrollPane scrollPane = new JScrollPane(canvas);
scrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
canvas.repaint();
}
});
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
canvas.repaint();
}
});
setPreferredSize(new Dimension(img.getWidth(),img.getHeight()+50));
add(toolbar, BorderLayout.PAGE_START);
add(scrollPane, BorderLayout.CENTER);
}
public BufferedImage grabImage() {
return canvas.getImage();
}
}
class JTools extends JPanel {
JSlider scale;
public JTools() {
scale= new JSlider(JSlider.HORIZONTAL,
0, 400, 100);
scale.setMajorTickSpacing(100);
scale.setPaintTicks(true);
scale.setPaintLabels(true);
scale.setPreferredSize(new Dimension(300,50));
add(scale);
}
}
class JCanvas extends Canvas {
BufferedImage im;
Graphics2D g2d;
Point old = new Point();
Point now = new Point();
public JCanvas(BufferedImage imIn) {
im = imIn;
g2d = im.createGraphics();
setPreferredSize(new Dimension(im.getWidth(), im.getHeight()));
setColor(Color.WHITE);
setWidth(4);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//g2d.drawRect(5, 5, 40, 20);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
//System.out.println(e.getPoint());
//g2d.fillRect(e.getX()-5, e.getY()-5, 10, 10);
old=e.getPoint();
now=e.getPoint();
g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
repaint();
}
});
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
//System.out.println(e.getPoint());
old=e.getPoint();
now=e.getPoint();
g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
repaint();
}
});
addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
//System.out.println(e.getPoint());
//g2d.fillRect(e.getX()-5, e.getY()-5, 10, 10);
old=now;
now=e.getPoint();
g2d.drawLine((int)old.getX(), (int)old.getY(), (int)now.getX(), (int)now.getY());
repaint();
}
});
}
public void paint(Graphics g) {
//super.paint(g);
update(g);
}
public void update(Graphics g) {
//super.update(g);
g.drawImage(im, 0, 0, null);
getToolkit().sync();
}
public void setWidth(float w) {
g2d.setStroke(new BasicStroke(w, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
}
public void setColor(Color c) {
g2d.setColor(c);
}
public BufferedImage getImage() {
return im;
}
}
class JCanvas extends Canvas {