Java Timer Bug?

fablue

Mitglied
Hallo! Ich arbeite gerade an einem Java Projekt, wofür ich eine schöne Gui implementiert habe! Alle Animationen laufen flüssig und konstant mit 30FPS. SOLANGE ich den Chrome oder Firefox Webbrowser gleichzeitig geöffnet habe! Ansonsten laggt es ziemlich! CPU Auslastung ist in beiden Fällen unter 5%! Ich habe alle Animationen mit Timern und einem ActionListener implementiert! Ich habe keine Ahung woran das liegen könnte... Ich bin am verzweifeln! Wenn jemand eine Idee hat, wäre ich sehr dankbar! Die Klassen sind leider alle zu lang, um sie hier anzuhängen =/

Vielen Dank schonmal im Voraus!
 

fablue

Mitglied
Teil eins:
Java:
public class GUI extends javax.swing.JFrame {

    /**
     * Creates new form GUI
     * @param con
     */
    public GUI(Controller con) {
        scrollAlphaAnimator = new ScrollAlphaAnimator();
        scroll = 0;
        scrollLock = 1;
        this.MessageBlockID = 1;
        c = con;
        Conversation = c.getConversation();
        lastStartID = 0;
        lastStopID = 0;
        initComponents();
        renderFLAG = 0;
        //KEYLISTENER AUF DAS EINGABE FELD
        TAentered.addKeyListener(new SendPressEnterListener());
        //SHIFT FLAG SOLL NULL SEIN
        shiftFLAG = 0;
        //INITIALISIEREN, der WRITINGFLAG
        this.refreshButton();
        Thread guiaction = new Thread(new GUIACTION());
        guiaction.start();

      //      mPane.add(z);
        // Kontrollelement "einpacken"
        pack();
        lastWIDTH = mPanel.getWidth();
    }

    public GUI() {
        initComponents();
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        mPanel = new Surface();
        jScrollPane1 = new javax.swing.JScrollPane();
        TAentered = new javax.swing.JTextArea();
        ButtonSend = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        username = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("chatblack");
        setAlwaysOnTop(true);
        setAutoRequestFocus(false);
        setBackground(new java.awt.Color(0, 0, 0));
        setMinimumSize(new java.awt.Dimension(350, 440));
        setType(java.awt.Window.Type.UTILITY);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                formComponentResized(evt);
            }
        });

        mPanel.setBackground(new java.awt.Color(255, 255, 255));
        mPanel.setPreferredSize(new java.awt.Dimension(1161, 669));
        mPanel.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
            public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
                mPanelMouseWheelMoved(evt);
            }
        });

        jScrollPane1.setBackground(new java.awt.Color(0, 130, 255));
        jScrollPane1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jScrollPane1.setForeground(new java.awt.Color(0, 130, 255));
        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        jScrollPane1.setOpaque(false);

        TAentered.setColumns(20);
        TAentered.setFont(new java.awt.Font("Candara", 0, 14)); // NOI18N
        TAentered.setLineWrap(true);
        TAentered.setRows(1);
        TAentered.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        TAentered.setDragEnabled(true);
        TAentered.setOpaque(false);
        jScrollPane1.setViewportView(TAentered);

        ButtonSend.setBackground(new java.awt.Color(0, 130, 255));
        ButtonSend.setForeground(new java.awt.Color(255, 255, 255));
        ButtonSend.setText("Send");
        ButtonSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ButtonSendActionPerformed(evt);
            }
        });

        username.setForeground(new java.awt.Color(0, 130, 255));
        username.setText("Sebi");

        javax.swing.GroupLayout mPanelLayout = new javax.swing.GroupLayout(mPanel);
        mPanel.setLayout(mPanelLayout);
        mPanelLayout.setHorizontalGroup(
            mPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(mPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSeparator1)
                    .addGroup(mPanelLayout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(mPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(ButtonSend, javax.swing.GroupLayout.DEFAULT_SIZE, 70, Short.MAX_VALUE)
                            .addComponent(username))))
                .addContainerGap())
        );
        mPanelLayout.setVerticalGroup(
            mPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mPanelLayout.createSequentialGroup()
                .addContainerGap(469, Short.MAX_VALUE)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 5, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(mPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(mPanelLayout.createSequentialGroup()
                        .addComponent(ButtonSend)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(username, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane1))
                .addGap(16, 16, 16))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(mPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(mPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 550, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void ButtonSendActionPerformed(java.awt.event.ActionEvent evt) {                                           

        if (writingFLAG == 1) {

            this.sendTextMessage();
            TAentered.setText("");
            TAentered.setCaretPosition(0);
            TAentered.requestFocus();

        }
    }                                          

    private void formComponentResized(java.awt.event.ComponentEvent evt) {                                      
        this.startresizeALGO();

    }                                     

    private void mPanelMouseWheelMoved(java.awt.event.MouseWheelEvent evt) {                                       
        int notches = evt.getWheelRotation();
        if (notches < 0) {
            //Moved up!
            this.simplescrollUP();

        } else {
            //moved down!
            this.simplescrollDOWN();
        }
        
        scrollAlphaAnimation();
    }                                      

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see [url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)[/url] 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GUI().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    javax.swing.JButton ButtonSend;
    javax.swing.JTextArea TAentered;
    javax.swing.JScrollPane jScrollPane1;
    javax.swing.JSeparator jSeparator1;
    javax.swing.JPanel mPanel;
    javax.swing.JTextField username;
    // End of variables declaration                   
   // private Client c;
    private int shiftFLAG;
    private int writingFLAG;
    private int refreshFLAG = 1;
    private database Conversation;
    private int renderFLAG;
    private Controller c;
    private int resizeFLAG;
    private int lastWIDTH;
    private int lastStartID;
    private int lastStopID;
    private int MessageBlockID;
    private double scroll;
    private int scrollLock;
    private double maxScroll;
    private double scrollPercent;
    private int lastinStopID;
    private double scrollAlpha;
    private int lastBlockHeight;
    ScrollAlphaAnimator scrollAlphaAnimator;
    
// clientPanel = g.clientPanel();
//            textArea_Messages = g.tAM();
//            textArea_input = g.tAi();
//            button_SendMessage = g.buttonSend();
//            textField_Username=g.tFU();
//            scrollPane_Messages=g.sPM();
    public javax.swing.JPanel clientPanel() {
        return mPanel;
    }

//        public javax.swing.JTextArea tAM()
//        {
//            return mTA;
//        }
//       
    public void setMessageBlockID(int nID)
    {
        this.Conversation.setMessageBlockID(nID);
        MessageBlockID = nID;
        
    }
    public void simplescrollUP() {
        
        if(scrollLock==0)
        {
        double multi = 1.0;
        ScrollAnimator upscroll = new ScrollAnimator(multi);
        upscroll.doScroll();
        }

    }

    public void simplescrollDOWN() 
    {
        if(scrollLock==0)
        {
        double multi = -1.0;
        ScrollAnimator upscroll = new ScrollAnimator(multi);
        upscroll.doScroll();  
        }

    }
    public void scrollAlphaAnimation()
    {
        
        scrollAlphaAnimator.animate();
    }
    public class ScrollAlphaAnimator implements ActionListener
    {
        private Timer ScrollAlphaTimer;
        private double speed;
        private double maxSpeed;
        private double iteration;
        private double stopat; //Die Auflösung!
        private double startat;
        private double testAlpha;
        private int isAnimating;
        private int AnimationHolder;
        public ScrollAlphaAnimator()
        {
            AnimationHolder = 0;
            testAlpha = scrollAlpha;
            stopat = 24;
            startat=-24.0;
            iteration = startat;
            speed = 0;
            maxSpeed = 2.0;
            isAnimating = 0;

        }
        public void animate()
        {
            if(isAnimating ==0)
            {
            iteration = startat;
            ScrollAlphaTimer = new Timer(25, this); 
            ScrollAlphaTimer.start();
            isAnimating =1;
            AnimationHolder = 60;
            }
            else
            {
                AnimationHolder = AnimationHolder+5;
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) 
        {
//                double a = (iteration/24.0); //Resonanzansatz
//                double quada = a*a;
//                double nenner = quada+1;
//                speed = maxSpeed/nenner;


             double a = maxSpeed / (-(24 * 24));  //quadratische Näherung: Unschön, da sehr abprubt!
            double b = (iteration * iteration) - (24 * 24);
            speed = a * b;
            
            
                if (speed < 0.03)
                {
                    speed = 0;
                }
                
                if (iteration >= stopat) 
                {
                ScrollAlphaTimer.stop();
            //    System.out.println("Animation Finished!");
                isAnimating =0;
                scrollAlpha=0;
                }
                testAlpha = speed;
                if(testAlpha > 2.0)
                {
                    scrollAlpha = 2.0;
                }
                else
                {
                    scrollAlpha = testAlpha;
                }
                
                if(AnimationHolder==0)
                {
                    if(iteration < 0)
                    {
                        iteration = iteration +2;
                    }
                    else
                    {
                     iteration = iteration +1;
                    }
                }
               
                else
                {
                    if(iteration<0)
                    {
                        iteration= iteration+2;
                        AnimationHolder = AnimationHolder -1;
                    }
                    else if(iteration ==0)
                    {
                        AnimationHolder = AnimationHolder-1;
                    }
                    else if(iteration>0)
                    {
                        iteration = iteration -2;
                        AnimationHolder = AnimationHolder-1;
                    }
                }
        }
        
    }

    public class ScrollAnimator implements ActionListener {

        private double speed;
        private double maxSpeed;
        private Timer scrollTimer;
        private double iteration;
        private double stopat; //Die Auflösung!
        private int startat;

        public ScrollAnimator(double multi) {
            stopat = 120;
            startat=-40;
            iteration = startat;
            speed = 0;
            maxSpeed = 1.9*multi;

        }

        public void doScroll() {
            scrollTimer = new Timer(40, this);
            scrollTimer.start();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
//            double a = maxSpeed / (-(r * r));  //quadratische Näherung: Unschön, da sehr abprubt!
//            double b = (iteration * iteration) - (r * r);
//            speed = a * b;
                 if(false)
            {
                 double a = maxSpeed / (-(24 * 24));  //quadratische Näherung: Unschön, da sehr abprubt!
                 double b = (iteration * iteration) - (24 * 24);
                 speed = a * b;
            }
            else
            {
                double a = (iteration/24.0);
                double quada = a*a;
                double nenner = quada+1;
                speed = maxSpeed/nenner;
            }
            
            

            //   speed=(maxSpeed/((-1)*(r^2)))*(iteration^2-r^2);
        // System.out.println("Speed is: "+speed);
            scroll = scroll + speed;
            if(scroll < 0)
            {
                scroll = 0;
                scrollTimer.stop();
            }
            if(scroll > maxScroll)
            {
                scroll=maxScroll;
                scrollTimer.stop();
                
                
            }
         
            if(iteration<0)
            {
                iteration= iteration+2;
            }
            else
            {
                iteration++;
            }
            if (iteration >= stopat) {
                scrollTimer.stop();
                
                
               // System.out.println("ScrollAnimation STopped!");
            }

        }

    }

    public javax.swing.JTextArea tAi() {
        return TAentered;
    }

    public javax.swing.JButton buttonSend() {
        return ButtonSend;
    }

    public javax.swing.JTextField tFU() {
        return username;
    }

    public void setrenderFlag(int i) {
        renderFLAG = i;
    }

    public void sendTextMessage() 
    {   String toSend = TAentered.getText();
        
        if (toSend.isEmpty())
        {
            System.out.println("Leerer Text!");
        }
        else if(toSend.equals("\n"))
        {
            System.out.println("Nur Umbruch!");
        }
        else if(toSend.equals(""))
        {
            System.out.println("Leerer Text2!");
        }
        else
        {
           // System.out.println("Message Send!");
        c.sendTextMessages(toSend);
        }
    }

    public database getDatabase() {
        return Conversation;
    }

    public void refreshButton() {
        // System.out.println("REFRESH!!");
        String s = TAentered.getText();
        if (s.isEmpty()) {
            writingFLAG = 0;
            ButtonSend.setEnabled(false);
        } else {

            writingFLAG = 1;
            ButtonSend.setEnabled(true);
        }

        String zb = "\n";
        if (s.equals(zb)) {
            TAentered.setText("");
             // TAentered.setCaretPosition(0);
            //TAentered.setColumns(0);
        }

    }

    public void startresizeALGO() {
        if (resizeFLAG == 0) {
            resizeFLAG = 1;
            this.startresize();
            lastWIDTH = mPanel.getWidth();
        }
    }

    public void testresize() {
        int currentWIDTH = mPanel.getWidth();
        if (currentWIDTH == lastWIDTH) {
            if (resizeFLAG == 1) {
                resizeFLAG = 0;
                this.stopresize();
            }
        } else {
            lastWIDTH = mPanel.getWidth();
        }
    }

    public void stopresize() {
     //   System.out.println("Stopping resize!");
        this.conversationFadeIn();
    }

    public void startresize() {
       // System.out.println("Staring resisze!");
        this.conversationFadeOut();
    }

    public void conversationFadeOut() {
        this.Conversation.fadeOut(lastStartID, lastStopID);
    }

    public void conversationFadeIn() {
        this.Conversation.fadeIn(lastStartID, lastStopID);
    }

//    public void renderms(int ms) {
//        Thread t = new Thread(new Rendertime(ms));
//        t.start();
//
//    }
 

fablue

Mitglied
Teil 2:
Java:
 public class SendPressEnterListener implements KeyListener {

        @Override
        public void keyPressed(KeyEvent arg0) {

            if (arg0.getKeyCode() == 16) {
                shiftFLAG = 1;
            }

            if (shiftFLAG == 0) {
                if (arg0.getKeyCode() == KeyEvent.VK_ENTER & writingFLAG == 1) {
                    sendTextMessage();
                    TAentered.setText("");
                    TAentered.setCaretPosition(0);
                }
            } else if (shiftFLAG == 1) {
                if (arg0.getKeyCode() == KeyEvent.VK_ENTER & writingFLAG == 1) {
                    String s = TAentered.getText() + "\n";
                    TAentered.setText(s);
                }
            }

        }

        @Override
        public void keyReleased(KeyEvent arg0) {

            if (arg0.getKeyCode() == 16) {
                shiftFLAG = 0;
            }

        }

        @Override
        public void keyTyped(KeyEvent arg0) {
        }

    }

    public class textlistener implements ActionListener {

        public GUI g;

        public textlistener(GUI b) {
            g = b;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            g.refreshButton();
        }
    }

    public class GUIACTION implements Runnable {

   //     private int iterator=0;
        @Override
        public void run() {

            while (refreshFLAG == 1) {
                refreshButton();
                testresize();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }

    }
    
    

///*    public class Rendertime implements Runnable//Hier muss noch gearbeitet werden um die Leistung zu optimieren!
//    {
//
//        private int ms;
//
//        public Rendertime(int time) {
//            ms = time;
//        }
//
//        @Override
//        public void run() {
//
//            renderFLAG = 1;
//            try {
//                Thread.sleep(ms);
//            } catch (InterruptedException ex) {
//                Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
//            }
//
//            renderFLAG = 0;
//
//        }
//
//    }*/
    class Surface extends JPanel
            implements ActionListener {

        private Timer timer;
        private int i;
        private BufferedImage background;
        private Graphics2D work;
        private BufferedImage img;
        private Image SP1;
        private Image SP2;

        public Surface() {

            initSurface();
            initTimer();

        }

        private void initSurface() {

            setBackground(Color.black);

            try {
                background = ImageIO.read(GUI.class.getResource("/img/physik.jpg"));
                img = ImageIO.read(GUI.class.getResource("/img/physik.jpg"));

            } catch (Exception e) {
                System.out.println("Datei nicht gefunden");
            }

            work = (Graphics2D) img.getGraphics();
            work.drawImage(background, null, 0, 0);
            work.setRenderingHint(
                    RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
//                
            RenderingHints rh
                    = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);

            rh.put(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);

            work.setRenderingHints(rh);

        }

        private void initTimer() {
            
            timer = new Timer(30, this);
            timer.setInitialDelay(190);
            timer.start();
 
        }

        public void imgflash() {
        //BufferedImage flashimg = new BufferedImage(mPanel.getHeight(),mPanel.getWidth(),BufferedImage.TYPE_INT_ARGB);
            //Versuch einen Weissen hintergrund zu schaffen

            //Background Paper
            work.drawImage(background, null, 0, 0);
        }

        public void render() {
            imgflash();
            renderConversation();
            renderScroll();

        }
        public void renderScroll()
        {
            int XOffset =0;
             
            //  System.out.println(scrollAlpha);
              double multi =scrollAlpha;
              if(scrollAlpha < 0)
              {
                  multi = (-1)*scrollAlpha;
              }
             
              int screenHeight =mPanel.getHeight()-95;
              int scrollHeight=screenHeight;
              if(lastBlockHeight > screenHeight)
              {
                  double Ueberstand = lastBlockHeight-screenHeight;
                  double q = (lastBlockHeight /(double)screenHeight);
                  if (q <1)
                  {
                      q =1;
                  }
                  scrollHeight =(int) (screenHeight/q);
              }
              
              
              double alphad=multi*114+26;
              int alpha = (int)alphad;
             Color   color = new Color(0,119,255,alpha);
             double animatedX = multi*4.0;
              int xPosition = (int)Math.round(mPanel.getWidth()-3-animatedX-XOffset);//-11 ist der Maximalwert!
              double Spielraum = mPanel.getHeight()-95-scrollHeight;
           //   double yPositiond = (mPanel.getHeight()-(105))*scrollPercent;
              double yPositiond = Spielraum*scrollPercent;
              double inverty = Spielraum-yPositiond;
              int yPosition = (int)inverty+3;
              
               BufferedImage scrollIMG = new BufferedImage(40,screenHeight,BufferedImage.TYPE_INT_ARGB);
              Graphics2D scrollG=(Graphics2D)scrollIMG.getGraphics();
                 scrollG.setColor(color);
              scrollG.fillRoundRect(1, 1, 10, scrollHeight, 5, 5);
            
              
                BufferedImage scrollBack = new BufferedImage(40,screenHeight,BufferedImage.TYPE_INT_ARGB);
              Graphics2D BackG=(Graphics2D)scrollBack.getGraphics();
                   
                RenderingHints qualityHints = new               RenderingHints(RenderingHints.KEY_ANTIALIASING,               RenderingHints.VALUE_ANTIALIAS_ON); 
                qualityHints.put(RenderingHints.KEY_RENDERING,               RenderingHints.VALUE_RENDER_QUALITY); 
                qualityHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                qualityHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                BackG.setRenderingHints(qualityHints); 
              double alphaBackd = multi*80+20;
                Color WhiteBack = new Color (0,119,255,60);
                 BackG.setColor(WhiteBack);
                 BackG.fillRoundRect(0, 0, 11, screenHeight, 10, 10);
                 
              work.drawImage(scrollBack, null, xPosition, 2);
              work.drawImage(scrollIMG, null, xPosition, yPosition);
             // System.out.println("x: "+xPosition+" y: "+yPosition);
        }
        
        public void renderConversation() {

            int Height = (int) (mPanel.getHeight() + scroll);
            int ScreenHeight = mPanel.getHeight();
            int Width = mPanel.getWidth();
            size dim = new size(Width, Height); //Die Dimension des Graphicfensters wird hier in ein Objekt der Klasse size gepackt!
            int Anzahl = Conversation.getLength();
            int x = 0;
            //Es werden Maximal 100 Gui Elemente wie Nachriten oder Anderes Angezeigt bwz. Gerendert, daher muss die Anzahl normiert werden!
            int MaximalElements = 100 * MessageBlockID;
            int start = 0; //StartID der Iterationen!
            if (Anzahl >= MaximalElements) {
                start = Anzahl - MaximalElements+1;
            }
            int MessageBlockStop = Anzahl;
            int fifty = 1;
            for (int j = start; j < Anzahl; j++) {
                if (Conversation.findID(j).islast()) {
                    MessageBlockStop = j;
                }
                if (fifty == MaximalElements) {
                    MessageBlockStop = j;
                }
                fifty++;
            }

            int MaxHeight = 0; //MaxHeight ist die gesammte Höhe der Gerenderten GuiElemente in Pixeln
            for (int i = start; i < MessageBlockStop; i++) {
                MaxHeight = MaxHeight + Conversation.findID(i).getGuiE().getHeight(dim);
            }
            lastBlockHeight=MaxHeight;
            maxScroll=MaxHeight-ScreenHeight+100;
      //  System.out.println(MaxHeight);
            //Wir suchen nun das Elment (id) mit der zu rendern angefangen werden soll (DIe effektive Höhe des bildes)
            int notvisible = MaxHeight - Height; //Nicht sichtbarer Bereich
            if (Height > MaxHeight) {
                notvisible = 0; 
            }
            int MessageScreen = ScreenHeight -120;//Wegen der unteren Leiste
            if(MaxHeight > MessageScreen)
            {
                scrollLock =0;
            }
            else 
            {
                scrollLock =1;
            }
            
            scrollPercent = scroll/maxScroll;
          //  System.out.println("The Scroll Percent is: "+scrollPercent);
           
                
           
        //

//Ermitteln der ID mit der Angefangen werden soll und die Höhe des zu renderenden Bildes
            int startID = 0; //Id mit der Später zu rendern angefangen werden soll
            int effektivHeight = 0;
            int iterationHeight = 0; //Starte natürlich bei 0
            int Plus = 0;
            for (int i = start; i < Anzahl; i++) {
                Plus = Conversation.findID(i).getGuiE().getHeight(dim);
                if (iterationHeight + Plus > notvisible) {
                    startID = i;
                    effektivHeight = MaxHeight - iterationHeight;
                    break;
                }

                iterationHeight = iterationHeight + Plus;
            }
            lastStartID = startID;

            //ermitteln der Scrollabhängigen Stop_ID
            int inStopID =Anzahl;
            int inStopfound=0;
            int stopID = Anzahl;
            int renderAnzahl;
               int off = effektivHeight-Height;
               int toFILL = off + ScreenHeight  ; //80 ist der Überstand über die GUI leiste!
               int toFillScreen = toFILL +80;


                int screenfilled = 0;
//                int off = Height - effektivHeight;
//                int toFILL = off + ScreenHeight ;
                
                    for (int k = startID; k < Anzahl; k++) {
                        Plus = Conversation.findID(k).getGuiE().getHeight(dim);
                        screenfilled = screenfilled + Plus;
                        if (screenfilled > toFILL) {
                            if(inStopfound==0)
                            {
                            inStopID = k;
                            inStopfound =1;
                            }
                           
                        }
                        if(screenfilled > toFillScreen)
                        {
                            stopID = k;
                           // System.out.println("inStopID found: "+inStopID+" Stop ID is: "+stopID);
                            break;
                        }
                    }
            
                renderAnzahl = stopID-startID;

                
              lastinStopID=inStopID;  
             lastStopID = stopID;

            //Wir rendern nun ein Buffered Image mit all den GUI elementen!
            int renderheight = effektivHeight; //Renderhöhe des Bildes von der STartID bis ID = 0 (neueste Nachricht = 0)
            //  System.out.println(iterationHeight);
            int startheight = Height - renderheight;
            iterationHeight = startheight;

            //GUI OFFSET FÜR DIE UNTERE GUI LEISTE:
            int offset = 120;

            iterationHeight = iterationHeight - offset;
            String thisuser = username.getText();

            BufferedImage ChatImg = new BufferedImage(mPanel.getWidth(),ScreenHeight-offset+35,BufferedImage.TYPE_INT_ARGB);
            Graphics2D ChatG = (Graphics2D)ChatImg.getGraphics();
            for (int i = startID; i < stopID; i++)//von Anzahl auf StopID umgestellt
            {
                Element e = Conversation.findID(i);
                GuiElement GuiE = e.getGuiE();
                BufferedImage iterationImage = GuiE.getImage(0, 0);
                String MessageUsername = GuiE.getUsername();
                int Modus = GuiE.getModus(); //Wenn 1 , dann ist die Nachricht von einem Selbst geschrieben

                if (Modus == 1) //Wenn man diese Nachricht selbst geschrieben hat:
                {
                    double multi = scrollAlpha;
                    int leftoffset =(int) (40-8); //WICHTIGES LEFTOFFSET!!!
                    
                    int Startpoint = Width - GuiE.getWidth(dim) - leftoffset;
                    ChatG.drawImage(iterationImage, null, Startpoint, iterationHeight);

                    iterationHeight = iterationHeight + Conversation.findID(i).getGuiE().getHeight(dim);
                } else {
                    ChatG.drawImage(iterationImage, null, 0, iterationHeight);
                    iterationHeight = iterationHeight + Conversation.findID(i).getGuiE().getHeight(dim);
                }
                

            }
            
            work.drawImage(ChatImg, null, 0, 0);

            //Nach der Objekt ID suchen, mit der zu rendern be
        }

        private void doDrawing(Graphics g) {

            Graphics2D g2 = (Graphics2D) g;
            Dimension size = getSize();
            render();
            g2.drawImage(img, null, 0, 0);
          
         }

        @Override
        public void paintComponent(Graphics g) {

            super.paintComponent(g);
            doDrawing(g);
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            repaint();
        }
    }

}
 

fablue

Mitglied
S****** Glaskugeln^^ Immer wenn man sie gerade mal wieder bräuchte...
Meine Kommentare sind ziemlich vogelwild... genauso ,wie meine Bezeichnung von Variablen, Klassen und Methoden!
Dast ist nicht gerade meine Stärke=/
 

rme

Top Contributor
Ich habe deinen Code wegen der Länge nicht gelesen, aber die Symptome kommen mir bekannt vor: Unter Windows kann man die Timer-Auflösung global (!) ändern. Flash macht das, weshalb das Starten eines Browsers die Timer-Auflösung auch für alle anderen Programme ändert.

Siehe: timeBeginPeriod function (Windows)

Die normale Auflösung von Windows beträgt 10ms, d.h. dein Timer wird mindestens 30ms warten. Die obige API-Funktion, die die Browser benutzen, ändert die Auflösung auf 1ms. Der Nachteil ist, dass das System dann deutlich mehr Energie verbraucht, deshalb ist das nicht standardmäßig aktiv.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
P Java Fx einrichten AWT, Swing, JavaFX & SWT 2
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Trèfle Ausklappbare Diagramme in Java AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
K JAVA FX Constraints AWT, Swing, JavaFX & SWT 2
F Java FX und webcam AWT, Swing, JavaFX & SWT 1
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
J Java SWT Tabelleninhalt formattieren AWT, Swing, JavaFX & SWT 10
Blender3D Falsche Werte mit Java Toolkit Screensize AWT, Swing, JavaFX & SWT 4
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
I Java Bildfarbe ändern wie bei Photoshop AWT, Swing, JavaFX & SWT 9
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
J Parallele Aktionen in Java FX richtig durchführen. AWT, Swing, JavaFX & SWT 5
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
M JavaFX java.lang.IllegalStateException: Location is not set. AWT, Swing, JavaFX & SWT 9
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
M Java zeichnet nicht pixelgenau AWT, Swing, JavaFX & SWT 40
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
S Java Gui AWT, Swing, JavaFX & SWT 5
R Sierpinski Dreieck mit Java FX AWT, Swing, JavaFX & SWT 4
Flynn java.lang.UnsupportedOperationException: Not supported yet AWT, Swing, JavaFX & SWT 7
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L java.lang.NullPointerException - Fehlermeldung AWT, Swing, JavaFX & SWT 2
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben