簡體   English   中英

Java:為我的框架定義的繪畫方法從另一個類引用時不會調用repaint()

[英]Java: A defined paint method for my frame won't call repaint() when referenced from another class

我試圖從另一個類調用此構造函數,但是當我創建新線程時,它永遠不會調用重繪。 如果我只是從類中的main方法調用run()方法,則它的工作原理與預期的完全一樣。 看來我的repaint()方法沒有從另一個類中調用。 我擔心我的另一個班級仍在進行計算,但是即使將其放入線程中,我也沒有運氣。

碼:

public class MakeTransparent implements Runnable{
private int i;
private static int dollars;
private float transparency;

public MakeTransparent(int dollars){

    this.setDollars(dollars);
    this.transparency = 1;
    this.i = 300;
}
@Override
public void run() {
    JFrame frame = new JFrame("Tiddlybiscuits"){
        private static final long serialVersionUID = 1L;

        public void paint(Graphics arg0) {
            Graphics2D g2 = (Graphics2D)arg0;
            super.paint(g2);
            g2.setColor(getBackground());
            g2.fillRect(0, 0, this.getWidth(),this.getHeight());
            g2.setColor(Color.CYAN);
            g2.setFont(g2.getFont().deriveFont(50, 200F));
            //System.out.println(arg0.getFontMetrics());
            String string = "+$";
            Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getTransparency());
            g2.setComposite(c);
            g2.drawString(string + getDollars(), 30, getI());
            try {Thread.sleep(40);} catch (InterruptedException e) {}
            setI(getI()-5);
            setTransparency(getTransparency()-.03f);
            repaint();
        }
    };
    frame.setSize(500,500);
    frame.setLocationRelativeTo(null);
    frame.setUndecorated(true);
    frame.setBackground(new Color(1,55,134,0));

    frame.setLayout(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    try { Thread.sleep(1400); } catch (InterruptedException e) {    }
    frame.dispose();
}
  • 不要從事件調度線程的上下文中調用Thread.sleep EVER
  • 不要在paint方法中調用任何可能導致repaint方法,這將導致無限的更新循環,最終將占用您的CPU
  • 避免覆蓋諸如JFrame類的頂級容器的paint ,除了不進行雙重緩沖外,大多數窗口還包含其他組件( JRootPanecontentPaneglassPane ),所有這些組件都可能干擾您嘗試繪制的內容
  • 擺動是單線程框架,不是線程安全的。 這意味着您永遠不要在事件調度線程的上下文內執行任何長時間運行或阻止的操作,並且永遠不要在事件調度線程之外創建或修改任何UI組件。
  • 只有一個EDT,並且所有UI代碼都將在其中運行。諸如繪畫之類的事情總是在EDT中自動執行。

看一眼:

有關如何在框架要求內工作的更多詳細信息和想法

褪色

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                TestPane tp = new TestPane();
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        float t = tp.getTransparancy() - 0.03f;
                        if (t < 0) {
                            t = 0;
                            ((Timer)e.getSource()).stop();
                        }
                        int i = tp.getI();

                        tp.setI(i - 1);
                        System.out.println(t);
                        tp.setTransparancy(t);
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(tp);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                timer.start();
            }
        });
    }

    public class TestPane extends JPanel {

        private float transparancy = 1f;
        private int i = 200;
        private int dollars;

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }

        public void setTransparancy(float value) {
            if (transparancy != value) {
                float old = transparancy;
                this.transparancy = value;
                firePropertyChange("transparancy", old, transparancy);
                repaint();
            }
        }

        public float getTransparancy() {
            return transparancy;
        }

        public int getDollars() {
            return dollars;
        }

        public int getI() {
            return i;
        }

        public void setI(int value) {
            if (i != value) {
                float old = i;
                this.i = value;
                firePropertyChange("i", old, i);
                repaint();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
            g2d.setColor(Color.CYAN);
            g2d.setFont(g2d.getFont().deriveFont(50, 200F));
            //System.out.println(arg0.getFontMetrics());
            String string = "+$";
            Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getTransparancy());
            g2d.setComposite(c);
            g2d.drawString(string + getDollars(), 30, getI());
            g2d.dispose();
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM