Interface 2 von einander unabhängige Frames mit Panel gleichzeitig nutzen

Java:
public class Test {
    public void createAndShowGUI() {
        newFrame("Frame 1", "Test 1");
        newFrame("Frame 2", "Test 2");
    }
    private void newFrame(String title, String content) {
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JLabel(content));
        frame.setSize(300, 200);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().createAndShowGUI());
    }
}
Liefert das bei Dir zwei unterschiedliche Fenster?
Ja gibt zwei unterschiedliche Fenster, bei meinem aber auch. Erst wenn ich repaint() aufrufe zeigen beide das Gleiche.
 
Erst wenn ich repaint() aufrufe zeigen beide das Gleiche.
Das wird ja immer lustiger, zumal repaint() thread-safe ist. Was passiert hier:
Java:
public class Test {
    public void createAndShowGUI() {
        JFrame frame1 = newFrame("Frame 1", "Test 1");
        JFrame frame2 = newFrame("Frame 2", "Test 2");
        new Thread(() -> {
            try { Thread.sleep(100); } catch (InterruptedException ex) {}
            frame1.repaint();
            frame2.repaint();
            System.out.println("Repainted");
        }).start();
    }
    private JFrame newFrame(String title, String content) {
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JLabel(content));
        frame.setSize(300, 200);
        frame.setVisible(true);
        return frame;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().createAndShowGUI());
    }
}
 
nope nix
wobei mir gerade noch ein Unterschied aufgefallen ist: wenn ich deinen code öffne, kann ich beide fenster einzeln schließen, schließe ich bei mir ein Fenster, schleißen sich beide
 
Ersetz mal bitte die folgenden Klassen (das sind Deine mit minimalen Änderungen):
Java:
package gui;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

import main.settings;

public class Frame extends JFrame {
    private static final long serialVersionUID = 1L;
    
    public Frame() {
        Panel panel = new Panel();    
        setSize(settings.frameWidth, settings.frameHeight);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setFocusable(true);
        add(panel);    
        addKeyListener(new KeyListener() {
            
            @Override
            public void keyTyped(KeyEvent e) {
                
            }
            
            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_SPACE) {
                    panel.pause();
                } else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
                    panel.changeSpeed(0);
                } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    panel.changeSpeed(1);
                }
            }
        });
        
        setVisible(true);
    }
}

Java:
package gui;

import java.awt.Color;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import main.settings;
import mergesort.algorithm;

public class Panel extends JPanel{
    
    private static final long serialVersionUID = 1L;
    private algorithm algorithm;
    private float multiplicator;
    private int[] data;
    private JButton start, okay;
    private int current = -1, left = -1, right = -1;
    private TreeFrame treeframe = new TreeFrame();

    public Panel() {
        setLayout(null);

        init();
        
        start = new JButton("start");
        start.setBounds(20,20,80,30);
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                start.setVisible(false);
                SwingUtilities.invokeLater(() -> algorithm.run());
            }
        });
        add(start);
        
        okay = new JButton("okay");
        okay.setBounds(20,20,80,30);
        okay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                init();
                okay.setVisible(false);
                start.setVisible(true);
                repaint();
            }
        });
        add(okay);
        okay.setVisible(false);
    }

    private void init() {
        this.algorithm = new algorithm(this, treeframe);
        this.data = algorithm.getData();
        this.multiplicator = getMultiplicator(data);
    }
    
    public void paintComponent(Graphics g) {
        
        g.fillRect(0, 0, settings.frameWidth, settings.frameHeight);
        
        for(int i = 0; i < data.length; i++) {
            if(i == current) g.setColor(Color.RED);
            else if(i == left || i == right) g.setColor(Color.GREEN);
            else g.setColor(Color.WHITE);
            
            int width = (settings.frameWidth) / data.length;
            int height = (int) ((int) data[i]*multiplicator);
            int x = i * width;
            int y = (int) settings.frameHeight - height;
            
            g.fillRect(x, y, width, height);
            
            g.setColor(Color.BLACK);
            g.drawRect(x, y, width, height);
        }
        
    }
    
    private float getMultiplicator(int[] data) {
        int max = data[0];
        
        for(int i = 0; i < data.length; i++) {
            if(max < data[i]) max = data[i];
        }
        
        float multiplicator = (settings.frameHeight-10) / (float) max;
        return multiplicator;
    }
    
    public void setData(int[] data, int current, int left, int right) {
        this.data = data;
        this.current = current;
        this.left = left;
        this.right = right;
        repaint();
    }
    
    public void setDefault() {
        okay.setVisible(true);
        current = -1;
        left = -1;
        right = -1;
    }
    
    public void pause() {
        algorithm.pause();
    }
    
    public void changeSpeed(int direction) {
        algorithm.changeSpeed(direction);
    }

}

Java:
package gui;

import javax.swing.JFrame;

public class TreeFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private TreePanel treepanel;

    public TreeFrame() {
        treepanel = new TreePanel();    
        
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setFocusable(true);
        add(treepanel);    
        setVisible(true);
    }
    
    public void addData(int[] newData) {
        treepanel.addData(newData);
    }
    
}

Java:
package gui;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Arrays;

import javax.swing.JPanel;

public class TreePanel extends JPanel {
    
    private static final long serialVersionUID = 1L;
    
    private ArrayList<int[]> info = new ArrayList<int[]>();

    public void paintComponent(Graphics g) {
        int y = 10;
        for(int i = 0; i < info.size(); i++) {
            g.drawString(Arrays.toString(info.get(i)), 10, y);
            y +=20;
        }
    }
    
    public void addData(int[] newData) {
        info.add(newData);
        System.out.println(Arrays.toString(newData));
        repaint();
    }
    
}
 
Ersetz mal bitte die folgenden Klassen (das sind Deine mit minimalen Änderungen):
Java:
package gui;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

import main.settings;

public class Frame extends JFrame {
    private static final long serialVersionUID = 1L;
   
    public Frame() {
        Panel panel = new Panel();   
        setSize(settings.frameWidth, settings.frameHeight);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setFocusable(true);
        add(panel);   
        addKeyListener(new KeyListener() {
           
            @Override
            public void keyTyped(KeyEvent e) {
               
            }
           
            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub
               
            }
           
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_SPACE) {
                    panel.pause();
                } else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
                    panel.changeSpeed(0);
                } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    panel.changeSpeed(1);
                }
            }
        });
       
        setVisible(true);
    }
}

Java:
package gui;

import java.awt.Color;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import main.settings;
import mergesort.algorithm;

public class Panel extends JPanel{
   
    private static final long serialVersionUID = 1L;
    private algorithm algorithm;
    private float multiplicator;
    private int[] data;
    private JButton start, okay;
    private int current = -1, left = -1, right = -1;
    private TreeFrame treeframe = new TreeFrame();

    public Panel() {
        setLayout(null);

        init();
       
        start = new JButton("start");
        start.setBounds(20,20,80,30);
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                start.setVisible(false);
                SwingUtilities.invokeLater(() -> algorithm.run());
            }
        });
        add(start);
       
        okay = new JButton("okay");
        okay.setBounds(20,20,80,30);
        okay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                init();
                okay.setVisible(false);
                start.setVisible(true);
                repaint();
            }
        });
        add(okay);
        okay.setVisible(false);
    }

    private void init() {
        this.algorithm = new algorithm(this, treeframe);
        this.data = algorithm.getData();
        this.multiplicator = getMultiplicator(data);
    }
   
    public void paintComponent(Graphics g) {
       
        g.fillRect(0, 0, settings.frameWidth, settings.frameHeight);
       
        for(int i = 0; i < data.length; i++) {
            if(i == current) g.setColor(Color.RED);
            else if(i == left || i == right) g.setColor(Color.GREEN);
            else g.setColor(Color.WHITE);
           
            int width = (settings.frameWidth) / data.length;
            int height = (int) ((int) data[i]*multiplicator);
            int x = i * width;
            int y = (int) settings.frameHeight - height;
           
            g.fillRect(x, y, width, height);
           
            g.setColor(Color.BLACK);
            g.drawRect(x, y, width, height);
        }
       
    }
   
    private float getMultiplicator(int[] data) {
        int max = data[0];
       
        for(int i = 0; i < data.length; i++) {
            if(max < data[i]) max = data[i];
        }
       
        float multiplicator = (settings.frameHeight-10) / (float) max;
        return multiplicator;
    }
   
    public void setData(int[] data, int current, int left, int right) {
        this.data = data;
        this.current = current;
        this.left = left;
        this.right = right;
        repaint();
    }
   
    public void setDefault() {
        okay.setVisible(true);
        current = -1;
        left = -1;
        right = -1;
    }
   
    public void pause() {
        algorithm.pause();
    }
   
    public void changeSpeed(int direction) {
        algorithm.changeSpeed(direction);
    }

}

Java:
package gui;

import javax.swing.JFrame;

public class TreeFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private TreePanel treepanel;

    public TreeFrame() {
        treepanel = new TreePanel();   
       
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setFocusable(true);
        add(treepanel);   
        setVisible(true);
    }
   
    public void addData(int[] newData) {
        treepanel.addData(newData);
    }
   
}

Java:
package gui;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Arrays;

import javax.swing.JPanel;

public class TreePanel extends JPanel {
   
    private static final long serialVersionUID = 1L;
   
    private ArrayList<int[]> info = new ArrayList<int[]>();

    public void paintComponent(Graphics g) {
        int y = 10;
        for(int i = 0; i < info.size(); i++) {
            g.drawString(Arrays.toString(info.get(i)), 10, y);
            y +=20;
        }
    }
   
    public void addData(int[] newData) {
        info.add(newData);
        System.out.println(Arrays.toString(newData));
        repaint();
    }
   
}
ändert leider auch nix
 
Wie es aussieht, scheint das ja ein lokales Problem bei mir zu sein. Kann man da mit Java oder sonst was irgendwas falsch machen, das zu dem Problem führt?
 
Wie es aussieht, scheint das ja ein lokales Problem bei mir zu sein. Kann man da mit Java oder sonst was irgendwas falsch machen, das zu dem Problem führt?
Es ist auf jeden Fall äußerst seltsam. Aber Dein Code ist auch recht chaotisch, insofern würde ich mal nichts ausschließen wollen. Du hast oben mal geschrieben, dass das erst beim repaint() auftritt. Bei welchem repaint() genau?
 
Es ist auf jeden Fall äußerst seltsam. Aber Dein Code ist auch recht chaotisch, insofern würde ich mal nichts ausschließen wollen. Du hast oben mal geschrieben, dass das erst beim repaint() auftritt. Bei welchem repaint() genau?

So wie ich das sehe ist das hier:
Java:
public void addData(int[] newData) {
    info.add(newData);
    System.out.println(Arrays.toString(newData));
    repaint();
}
in gui.TreePanel

und zum Thema Unübersichtlichkeit: Ich bin noch Anfänger in Java und bin froh wenn mein Zeug überhaupt läuft, bin aber offen für Tipps und Verbesserungsvorschläge um das übersichtlicher zu gestalten.
 
Änder das bitte mal zu:
Java:
public void addData(int[] newData) {
    if (!SwingUtitities.isEventDispatchThread()) {
        SwingUtilities.invokeLater(() -> addData(newData));
        return;
    }
    info.add(newData);
    System.out.println(Arrays.toString(newData));
    repaint();
}
 
Änder das bitte mal zu:
Java:
public void addData(int[] newData) {
    if (!SwingUtitities.isEventDispatchThread()) {
        SwingUtilities.invokeLater(() -> addData(newData));
        return;
    }
    info.add(newData);
    System.out.println(Arrays.toString(newData));
    repaint();
}
immernoch das selbe
 
Ich habe das jetzt nochmal "neu" geschrieben, habe aber immer noch das gleiche Problem. Jetzt sehe ich auch von Anfang an den Start Button in beiden Fenstern und im zweiten Fenster sehe ich auch wie ich im ersten Fenster über den Start-Button hovere.
 

Anhänge

Ich habe die Lösung:
man muss in die
Java:
public void paintComponent(Graphics g) {
    
}
in den Panel-Klassen einen super-Befehl einfügen:
Code:
public void paintComponent(Graphics g) {
    super.paintComponent(g);
}
 

Zurück
Oben