JPanel
을 확장하고 paint()
메서드를 재정의하는 차트를 만들었습니다. 이 패널을 클릭하면 차트의 "스냅 샷"을 만들고 새로운 JFrame
에서 열어보고 싶습니다.JPanel의 스냅 샷을 찍은 다음 새 창에 표시하십시오.
아래와 같이 버퍼링 된 이미지를 만들려고했으나 문제는 크기를 조정할 때 품질이 느슨합니다.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SnapshotDemo extends JPanel{
private JComponent src;
private BufferedImage img;
private final JFrame f = new JFrame();
public SnapshotDemo(JComponent src) {
super(new BorderLayout());
this.src = src;
this.img = takeSnapshot(src);
}
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.drawImage(img, 0, 0, getWidth(), getHeight(), null);
}
public void display(){
f.setContentPane(this);
f.setSize(1000,600);
f.setVisible(true);
}
public static BufferedImage takeSnapshot(JComponent src){
BufferedImage i = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = i.createGraphics();
src.printAll(g2);
return i;
}
public static void main(String[] args) {
JPanel p = new JPanel(){
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
int x = 0;
int y = 0;
int stepx = getWidth()/5;
int stepy = getHeight()/5;
for(int i=0; i<10; i++){
g2.drawLine(x, y, x+stepx, y+stepy);
x+=stepx;
y+=stepy;
}
g2.setPaint(Color.red);
g2.drawOval(getWidth()/2-30, getHeight()/2-30, 60, 60);
}
};
p.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
SnapshotDemo d = new SnapshotDemo(p);
d.display();
}
});
JFrame f = new JFrame();
f.setContentPane(p);
f.setSize(1000, 600);
f.setVisible(true);
}
}
이 문제를 더 잘 처리하는 방법에 대한 아이디어가 있으십니까? 이미지 (BufferedImage
등 ...)의 사용을 피할 수있는 방법이 있습니까? 미리 감사드립니다.
차트 모델의 스냅 샷을 만들고이 프레임을 새 프레임에 사용하십시오. –
무슨 뜻인지 좀 더 설명해 주시겠습니까? 미안하지만 나는 프로그래머가 아니며 "인형을위한"설명이 필요합니다. D – Roberto
스윙은 모델 뷰 컨트롤러 아키텍처를 기반으로하므로 뷰는 모델 상태 만 표시합니다. 따라서 모델의 스냅 샷을 찍어 다른 뷰 인스턴스와 함께 사용하면 크기를 조정할 수 있습니다. mvc에 대한 자세한 내용은 http://www.oracle.com/technetwork/articles/javase/index-142890.html 및 https://www.link-intersystems.com/blog/2013/07/20을 참조하십시오./the-mvc-pattern-implemented-java-swing/ –