मेरे पास एक साधारण वर्ग है जो माउस ड्रैगिंग या माउस दबाते समय एक बिंदु खींचती है (रिलीज़)।विंडो की सामग्री गायब हो जाती है जब
जब मैं एप्लिकेशन को कम करता हूं और फिर इसे पुनर्स्थापित करता हूं, तो विंडो की सामग्री अंतिम बिंदु (पिक्सेल) को छोड़कर गायब हो जाती है। मैं समझता हूं कि विधि super.paint(g)
खिड़की में हर बार पृष्ठभूमि को प्रतिबिंबित करती है, लेकिन नतीजा ऐसा लगता है कि मैं इसका उपयोग करता हूं या नहीं। उनमें से दोनों के बीच का अंतर यह है कि जब मैं इसका उपयोग नहीं करता हूं तो खिड़की पर चित्रित पिक्सेल से अधिक है, लेकिन मेरी सभी पेंटिंग नहीं। मैं इसे कैसे ठीक करूं?
यहां कक्षा है।
package painting;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
class CustomCanvas extends Canvas{
Point oldLocation= new Point(10, 10);
Point location= new Point(10, 10);
Dimension dimension = new Dimension(2, 2);
CustomCanvas(Dimension dimension){
this.dimension = dimension;
this.init();
addListeners();
}
private void init(){
oldLocation= new Point(0, 0);
location= new Point(0, 0);
}
public void paintLine(){
if ((location.x!=oldLocation.x) || (location.y!=oldLocation.y)) {
repaint(location.x,location.y,1,1);
}
}
private void addListeners(){
addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
@Override
public void mouseReleased(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
});
}
@Override
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.red);
g.drawLine(location.x, location.y, oldLocation.x, oldLocation.y);
}
@Override
public Dimension getMinimumSize() {
return dimension;
}
@Override
public Dimension getPreferredSize() {
return dimension;
}
}
class CustomFrame extends JPanel {
JPanel displayPanel = new JPanel(new BorderLayout());
CustomCanvas canvas = new CustomCanvas(new Dimension(200, 200));
public CustomFrame(String titlu) {
canvas.setBackground(Color.white);
displayPanel.add(canvas, BorderLayout.CENTER);
this.add(displayPanel);
}
}
public class CustomCanvasFrame {
public static void main(String args[]) {
CustomFrame panel = new CustomFrame("Test Paint");
JFrame f = new JFrame();
f.add(panel);
f.pack();
SwingConsole.run(f, 700, 700);
}
}
स्विंग और एडब्ल्यूटी घटकों को एक साथ मिलाएं! यदि यह अभी समस्या का कारण नहीं बना रहा है, तो यह तब होगा जब आप मेनू, टूल-टिप्स, कंमोस या अन्य फ़्लोटिंग तत्व जोड़ते हैं। इस उपयोग-मामले के लिए कितने तैयार तत्व सामान्य होंगे? क्या उन्हें कभी हटा दिया जाएगा? यदि पहले का जवाब 'हजारों' है और दूसरा 'नहीं' है, तो एक 'बुफर्ड इमेज' (लेबल में प्रदर्शित) एक बेहतर विकल्प हो सकता है। एक लेबल श्रोता लेबल में जोड़ा जा सकता है। –
री स्विंग/एडब्ल्यूटी। विशेष रूप से यह 'कैनवास' है जिसका मैं जिक्र कर रहा हूं। स्विंग समकक्ष के लिए, 'JComponent' या' JPanel' का विस्तार करें, फिर 'पेंट() 'के बजाय' paintComponent()' को ओवरराइड करें। बीटीडब्लू - एक छवि को प्रतिपादन का मतलब है * कुछ भी * नहीं बढ़ाना, और 'java.awt.Label' छवियों का समर्थन नहीं करता है,' javax.swing.JLabel' करता है। ;) –
हां, मैं पाया गया उदाहरण देख रहा हूं [यहां] (http://stackoverflow.com/questions/6132988/painting-in-a-bufferedimage-inside-swing-java) और मैं योजना बना रहा हूं एक बफर्ड छवि का उपयोग करें क्योंकि मुझे अपनी छवियों को सहेजने की भी आवश्यकता है, लेकिन इस पल के लिए मैं समझने की कोशिश कर रहा हूं कि काम कैसे करें और अपडेट करें। उदाहरण के लिए, मेरे कोड में (जैसे ही मुझे पता चला कि मैं कैसे और कहां पोस्ट करूंगा), मुझे समझ में नहीं आता कि अद्यतन में विधि पेंट को कॉल करना बिल्कुल वही कोड लिखने जैसा नहीं है (पेंट विधि से) अद्यतन विधि में। –