Swing Zähler im Hintergrund falsch berechnet - Warum?

Bexan

Mitglied
Hallo zusammen,

anbei möchte ich euch meinen Testcode zeigen.
Wenn man die Buttons für die Navigation betätigt, dann rechnet er exponentiell aufwärts. Guckt es euch am Besten selber eben an. Ich finde den Fehler gerade nicht -.- Eine Ausgabe des Zählers habe ich eingebaut.

Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class Testcode { 
    int woSindWir = 0;
    JFrame frame = new JFrame("Verwaltung");
    JPanel thesuper = new JPanel();
    JPanel p1 = new P(85);
    JPanel p2 = new P(15);
    JPanel pa1= new JPanel();
    JPanel pa2 = new JPanel();
    JPanel pa3 = new JPanel();
    JPanel pa4 = new JPanel();
    JPanel pa5 = new JPanel();
    JPanel pa6 = new JPanel();
    JPanel pa7 = new JPanel();
    JTabbedPane tabbedPane = new JTabbedPane();
    JButton jbstart = new JButton("|<");
    JButton jbend = new JButton(">|");
    JButton jbup = new JButton(">");
    JButton jbdown = new JButton("<");
    JTextField navi = new JTextField();

    Font ap = new Font("Arial", Font.BOLD | Font.ITALIC, 36);
    JLabel überschrift = new JLabel("Verwaltung");

    public Testcode() {
        basis();
        verwalten(-10);
    }

    public void basis()
    {
        frame.setBounds(20,20,900,400);

        thesuper.setLayout(new BoxLayout(thesuper, BoxLayout.PAGE_AXIS));
        thesuper.setBackground(new Color(226,0,116));
        frame.add(thesuper);
        überschrift.setForeground(Color.WHITE);
        überschrift.setFont(ap);
        thesuper.add(überschrift);

        p1.setBackground(new Color(226,0,116));
        p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));

        p2.setBackground(new Color(226,0,116));
        p2.setLayout(null);
        thesuper.add(p1);
        thesuper.add(p2);

        tabbedPane.addTab("pane 1", null, pa1, null);
        tabbedPane.addTab("pane 2", null, pa2,null);
        tabbedPane.addTab("pane 3", null, pa3, null);
        tabbedPane.addTab("pane 4", null, pa4, null);
        tabbedPane.addTab("pane 5", null, pa5, null);
        tabbedPane.addTab("pane 6", null, pa6, null);
        tabbedPane.addTab("Pane 7", null, pa7, null);
        tabbedPane.setBackground(Color.WHITE);
        p1.add(tabbedPane); 
        frame.setVisible(true);
        tabbedPane.addChangeListener(new ChangeListener()
            {
                public void stateChanged(ChangeEvent e){
                    JTabbedPane jtb = (JTabbedPane) e.getSource();
                    System.out.println(jtb.getTitleAt(jtb.getSelectedIndex()));        
                    verwalten(-10);
                }
            });
    }

    public void verwalten(int datensatz)
    {
        jbstart.setBounds(10,10,50,25);
        jbend.setBounds(235,10,50,25);
        jbup.setBounds(180,10,50,25);
        jbdown.setBounds(65,10,50,25);
        navi.setBounds(120,10,55,25);
        navi.setHorizontalAlignment(SwingConstants.CENTER);
        p2.removeAll();
        p2.repaint();
        System.out.println(woSindWir);
        if(datensatz == 0)
        { 
            woSindWir = 10; 
        } 
        else if(datensatz == -10)
        {
            woSindWir = 1;
        } 
        else woSindWir += datensatz;
        navi.setText(String.valueOf(woSindWir));

        p2.add(jbstart);
        jbstart.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent arg0){
                    verwalten(-10);
                }
            });

        navi.setEditable(true);
        p2.add(navi);

        p2.add(jbend);
        jbend.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent arg0){
                    verwalten(0);
                }
            });
        //if(woSindWir < 10)
        //{
        p2.add(jbup);
        jbup.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent arg0) {
                    verwalten(1);
                }
            });
        //}
        if(woSindWir > 1)
        {
            p2.add(jbdown);
            jbdown.addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent arg0) {
                        verwalten(-1);
                    }
                });            
        }
    }

    public static void main(String[] args)
    {
        new Testcode();
    }
}
Die benötigten zweite Klasse...
Java:
import javax.swing.JPanel;
import java.awt.Dimension;
class P extends JPanel {
        private int percent;
        public P(int percent) {
            this.percent = percent;
        }

        @Override
        public Dimension getPreferredSize() {
            Dimension d = getParent().getSize();
            int w = d.width * percent / 100;
            int h = d.height * percent / 100;
            return new Dimension(w,h);
        }
    }
 
bei jedem verwalten() fügst du neue Listener hinzu, wenn schon 8 geadded sind, gibt es 8 Events -> 16 Listener, usw. immer Verdopplung,
adde die Listener nur einmal im Konstruktor oder so, oder entferne immer den alten

auch die restlichen aufwendigen GUI-Arbeiten sind bisher gar nicht vom Parameter abhängig?
wenn du nur einmal Text ändern willst ist panel.removeAll() usw. brutal




@c_sidi90
oh, für mich wars diesmal schon spannend genug, 'rechnet er exponentiell aufwärts' 😉
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank. Da war der Knackpunkt. Die ActionListener füge ich jetzt im Konstruktor einmalig hinzu. Bei den restlichen GUI-Bauten hatte ich jetzt dem Codeschnipsel nicht beigefügt. Mit RemoveAll() wollte ich auch nur kurz zum Testen arbeiten. Hatte ich vergessen wieder zu löschen.

ich weiß jetzt nicht, was du geschrieben hast c_sidi90, aber da es wohl ähnlich war, bedank ich mich bei dir auch 🙂

hv a nc dy @ all
 

Neue Themen


Zurück
Oben