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

CptK

Bekanntes Mitglied
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.
 

mihe7

Top Contributor
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());
    }
}
 

CptK

Bekanntes Mitglied
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
 

mihe7

Top Contributor
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();
    }
    
}
 

CptK

Bekanntes Mitglied
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
 

CptK

Bekanntes Mitglied
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?
 

mihe7

Top Contributor
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?
 

CptK

Bekanntes Mitglied
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.
 

mihe7

Top Contributor
Ä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();
}
 

CptK

Bekanntes Mitglied
Ä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
 

CptK

Bekanntes Mitglied
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

  • Sorting.zip
    16,9 KB · Aufrufe: 2

CptK

Bekanntes Mitglied
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);
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
F Input/Output 2 Textdateien mit einander vergleichen Java Basics - Anfänger-Themen 11
M Elemente in einer ArrayList einander zuordnen. Java Basics - Anfänger-Themen 18
K zwei GregorianCalender Datums von einander abziehen-> Problem! Java Basics - Anfänger-Themen 7
Joew0815 Zwei ArrayListen mit einander vergleichen Java Basics - Anfänger-Themen 33
Z Feld prüfen ob 3 gleiche zahlen nach einander vorkommen Java Basics - Anfänger-Themen 3
G zwei java nach einander ausführen Java Basics - Anfänger-Themen 14
O uhrzeit mit einander vergleichen Java Basics - Anfänger-Themen 10
G Frames mit einander verbinden Java Basics - Anfänger-Themen 10
G 2 Vorgänge nach einander ablaufen zu lassen Java Basics - Anfänger-Themen 13
M 2 Datum mit einander vergleichen ??? Java Basics - Anfänger-Themen 7
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
D Plattform unabhängige System-variablen Java Basics - Anfänger-Themen 3
M OS unabhängige Visualisierung einer Steuerung Java Basics - Anfänger-Themen 12
I In der Mitte eines Frames mit BorderLayout etwas malen Java Basics - Anfänger-Themen 7
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
S Position eines Frames Java Basics - Anfänger-Themen 3
S Frames Verbinden Java Basics - Anfänger-Themen 19
S Auf eine variable/objekt eines frames zugrifen Java Basics - Anfänger-Themen 22
C Einige Fragen zu Frames Java Basics - Anfänger-Themen 7
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
U [Problem] Handling multiple frames Java Basics - Anfänger-Themen 5
G Aufrufen eines Frames aus einer anderen Klasse Java Basics - Anfänger-Themen 6
A Intelligente Anordnung von Frames in einer Fläche Java Basics - Anfänger-Themen 4
D Compiler-Fehler Frames verbinden Java Basics - Anfänger-Themen 6
S Mehrere Frames Java Basics - Anfänger-Themen 4
D JMenuBar und Hintergrund eines Frames Java Basics - Anfänger-Themen 2
M Zwei Frames ein ActionListener Java Basics - Anfänger-Themen 21
K Schließen eines Frames Java Basics - Anfänger-Themen 4
G Java-Frames funktionieren nach Neuinstallation nicht mehr. Java Basics - Anfänger-Themen 3
S Frames schließen Java Basics - Anfänger-Themen 14
D Sound in Frames möglich? EDIT Class Clip Java Basics - Anfänger-Themen 5
V Wie auf Elemente des Frames zugreifen Java Basics - Anfänger-Themen 4
A frames layout Java Basics - Anfänger-Themen 4
Z frames Java Basics - Anfänger-Themen 3
G Frames unabhänig schliessen. Java Basics - Anfänger-Themen 2
G Ist es möglich, den 'Rahmen' eines Frames durch Grafiken. Java Basics - Anfänger-Themen 5
G Liste in mehreren unabhängigen Frames aktualisieren. Java Basics - Anfänger-Themen 6
V Aufruf eines Frames Java Basics - Anfänger-Themen 6
H 3 buttons in 3-spalten eines frames Java Basics - Anfänger-Themen 3
E Farbänderung des Frames bei Klick . Java Basics - Anfänger-Themen 7
B Analoguhr und openTime eines Frames Java Basics - Anfänger-Themen 6
G Applets in Frames & Bilder Java Basics - Anfänger-Themen 10
P Beide frames werden geschlossen Java Basics - Anfänger-Themen 2
M Infernal Frames Java Basics - Anfänger-Themen 4
G mehrere Frames nacheinander aktualisieren Java Basics - Anfänger-Themen 2
G Methode zum schliessen eines frames - nicht durch windows X Java Basics - Anfänger-Themen 14
D Menü soll immer da bleiben - Frames sollen wechseln Java Basics - Anfänger-Themen 3
Chucky 2 Frames Farbwahl durch Buttons Java Basics - Anfänger-Themen 10
P Frage zu Frames: Fenster sichtbar, unsichtbar machen Java Basics - Anfänger-Themen 1
G Frames Java Basics - Anfänger-Themen 4
M 2 Frames Java Basics - Anfänger-Themen 16
M Daten zwischen Frames austauschen Java Basics - Anfänger-Themen 2
M 2 frames separat schliessen Java Basics - Anfänger-Themen 22
D Frage zu Frames! Java Basics - Anfänger-Themen 9
S Zwei Frames miteinander verbinden Java Basics - Anfänger-Themen 5
Q Kommunikation zwischen Frames Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben