Mehrere JComponents übereinander

Status
Nicht offen für weitere Antworten.
N

nicolas

Gast
hallo zusammen,

ich habe eine jcomponent programmiert, die häufig neu gezeichnet wird. nun müsste aber eigentlich nur ein teil dieser komponente neu gezeichnet werden.
kann man in swing irgendwie komponenten übereinanderlagern?

ich habs mal folgendermassen probiert. ich benutze als layoutmanager die tablelayout library. da kann man eine art tabelle angeben und die components in die zellen platzieren. nun habe ich zwei jcomponents in dieselbe zelle gesetzt, was auch funktioniert.
die jcomponents werden über einen listener informiert, wenn sich etwas geändert hat und werden dann neu gezeichnet. wenn ich jedoch eine komponente von diesen zwei übereinanderliegenden neu gezeichnet wird, wird die paintComponent() der darunterliegenden komponente auch aufgerufen. wie kann ich das verhindern? kann man komponenten in swing überhaupt unabhängig voneinander überlagern?

thanx und gruss,
nicolas
 

André Uhres

Top Contributor
"paintComponent" wird normalerweise sooft aufgerufen wie nötig.
Wenn z.B. Die Anwendung von einer anderen überdeckt wird und dann
wieder aufgedeckt wird, dann werden alle "paintComponent" Methoden
aufgerufen die nötig sind um den Inhalt der Anwendung neu zu zeichnen.

Seit 1.5 kann allerdings mit "setComponentZOrder" die Reihenfolge festgelegt
werden in der die Komponenten gezeichnet werden. Wo Komponenten sich
überlagern, wird die Komponente mit dem niedrigeren "z-order" über die
Komponente mit dem höheren "z-order" gezeichnet.

Vielleicht gibt es einen anderen Weg, das zu erreichen was du willst.
Aber für mich ist nicht klar was du eigentlich bezwecken willst.
Code:
/*
 * Ueberlagern_.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Ueberlagern_ extends JFrame {
    public Ueberlagern_() {
        super("Ueberlagern");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        //JComponents erzeugen:
        toolbar = new JToolBar();
        button1 = new JButton("A");
        button2 = new JButton("B");
        mainPanel = new JPanel();
        panel_A = new Panel_1(0,0);
        panel_B = new Panel_1(20,20);
        //Layout:
        toolbar.add(button1);
        toolbar.add(button2);
        toolbar.setOrientation(JToolBar.VERTICAL);
        getContentPane().add(toolbar, BorderLayout.WEST);
        panel_A.setBackground(Color.green); 
        panel_B.setBackground(Color.yellow); 
        mainPanel.setLayout(null);
        mainPanel.add(panel_A);
        mainPanel.add(panel_B);
        mainPanel.setComponentZOrder(panel_A,0);
        mainPanel.setComponentZOrder(panel_B,1);
        getContentPane().add(mainPanel, BorderLayout.CENTER);
        //Listeners:
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                rot = !rot;
                if(rot) panel_A.setBackground(Color.red);
                else panel_A.setBackground(Color.green);
                mainPanel.repaint();
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                blau = !blau;
                if(blau) panel_B.setBackground(Color.blue);
                else panel_B.setBackground(Color.yellow);
                mainPanel.repaint();
            }
        });
    }
    
    public static void main(final String args[]) { new Ueberlagern_().setVisible(true); }
    private Panel_1 panel_A, panel_B;
    private JButton button1, button2;
    private JPanel mainPanel;
    private JToolBar toolbar;
    private boolean rot, blau;
}
class Panel_1 extends JPanel{
    public Panel_1(int x, int y){
        setLocation(x,y);
        setSize(getPreferredSize());
    }
    public Dimension getPreferredSize(){
        return new Dimension(111,111);
    }
    public void paintComponent(final Graphics g){
        super.paintComponent(g);
        g.drawRect(0,0,100,100);
        g.drawRect(10,10,100,100);
    }
}
 
N

nicolas

Gast
ich schreibe mein programm für java 1.4, daher fällt die 1.5 variante schon mal weg.

mein jcomponent ist eben ziemlich aufwändig und wird alle 50ms neu gezeichnet. jedoch müsste eben nur ein arc2d neu gezeichnet werden, der rest verändert sich nicht.
nun ist es eben ziemlich rechenaufwändig, alle 50ms die ganzen berechnungen zu machen und die ganze komponente neu zu zeichnen. diese berechnungen wollte ich dadurch verhindern.
sonst jemand eine idee, wie ich das lösen könnte?
 

André Uhres

Top Contributor
Nur damit ich dich richtig verstehe:
der untere JComponent ist der rechenaufwendige und
der obere JComponent derjenige der öfters neu zu zeichnen ist
( mit "setOpaque(false)", also durchsichtigem Hintergrund ).
Ist das so richtig? :###

Wenn ja, dann könnte man vielleicht von dem rechenaufwendige JComponent
ein BufferedImage machen, das schneller gezeichnet werden kann als wenn
man die zeitaufwendigen Berechnungen jedesmal neu durchlaufen muss. :D
Der untere JComponent braucht dann nur noch das fertige BufferedImage zu zeichnen. :toll:
Code:
/*
 * Ueberlagern_2.java
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class Ueberlagern_2 extends JFrame {
    public Ueberlagern_2() {
        super("Ueberlagern 2");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        //JComponents erzeugen:
        toolbar = new JToolBar();
        button1 = new JButton("A");
        button2 = new JButton("B");
        mainPanel = new JPanel();
        panelAufwendig = new PanelAufwendig(0,0);
        panelAufwendig.setColor(Color.green);
        image = createImage(panelAufwendig);
        panel_A = new Panel_A(0,0);
        panel_A.setImage(image);
        panel_B = new Panel_B(20,20);
        panel_B.setColor(Color.yellow);
        //Layout:
        toolbar.add(button1);
        toolbar.add(button2);
        toolbar.setOrientation(JToolBar.VERTICAL);
        getContentPane().add(toolbar, BorderLayout.WEST);
        mainPanel.setLayout(null);
        mainPanel.add(panel_B);
        mainPanel.add(panel_A);
        getContentPane().add(mainPanel, BorderLayout.CENTER);
        //Listeners:
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                rot = !rot;
                setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                if(rot) panelAufwendig.setColor(Color.red);
                else panelAufwendig.setColor(Color.green);
                image = createImage(panelAufwendig);
                panel_A.setImage(image);
                mainPanel.repaint();
                setCursor(Cursor.getDefaultCursor());
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                blau = !blau;
                if(blau) panel_B.setColor(Color.blue);
                else panel_B.setColor(Color.yellow);
                mainPanel.repaint();
            }
        });
    }
    public static BufferedImage createImage(final JComponent component){
        component.setOpaque( true );
        Dimension d = component.getSize();
        BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        g2d.setClip(new Rectangle(0, 0, d.width, d.height) );
        component.paint( g2d );
        g2d.dispose();
        return image;
    }
    
    public static void main(final String args[]) { new Ueberlagern_2().setVisible(true); }
    private PanelAufwendig panelAufwendig;
    private Panel_A panel_A;
    private Panel_B panel_B;
    private JButton button1, button2;
    private JPanel mainPanel;
    private JToolBar toolbar;
    private boolean rot, blau;
    private BufferedImage image;
}
class PanelAufwendig extends JPanel{
    public PanelAufwendig(int x, int y){
        setOpaque(true);
        setLocation(x,y);
        setSize(getPreferredSize());
    }
    public Dimension getPreferredSize(){
        return new Dimension(111,111);
    }
    public void paintComponent(final Graphics g){
        super.paintComponent(g);
        g.setColor(color);
        g.drawRect(0,0,100,100);
        g.drawRect(10,10,100,100);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
    public void setColor(final Color color){
        this.color = color;
    }
    private Color color;
}
class Panel_A extends JPanel{
    public Panel_A(int x, int y){
        setOpaque(true);
        setLocation(x,y);
        setSize(getPreferredSize());
    }
    public Dimension getPreferredSize(){
        return new Dimension(111,111);
    }
    public void paintComponent(final Graphics g){
        super.paintComponent(g);
        g.drawImage(image,0,0,null);
    }
    public void setImage(final BufferedImage image){
        this.image = image;
    }
    private BufferedImage image;
}
class Panel_B extends JPanel{
    public Panel_B(int x, int y){
        setOpaque(false);
        setLocation(x,y);
        setSize(getPreferredSize());
    }
    public Dimension getPreferredSize(){
        return new Dimension(111,111);
    }
    public void paintComponent(final Graphics g){
        super.paintComponent(g);
        g.setColor(color);
        g.drawRect(0,0,100,100);
        g.drawRect(10,10,100,100);
    }
    public void setColor(final Color color){
        this.color = color;
    }
    private Color color;
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
F JavaFX Mehrere Stages "managen" AWT, Swing, JavaFX & SWT 2
r4w Changelistener auf mehrere Textfelder AWT, Swing, JavaFX & SWT 5
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
S Swing Mehrere Modal-Dialoge übereinander AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
C Java FX Warnmeldung: Mehrere Fonts gehören derselben Familie und Stil AWT, Swing, JavaFX & SWT 2
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
KaffeeFan mehrere JTextField durchlaufen AWT, Swing, JavaFX & SWT 4
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
G JavaFX Menü und mehrere Scenes AWT, Swing, JavaFX & SWT 16
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
D Mehrere RadiButtons auswählar AWT, Swing, JavaFX & SWT 3
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
T JavaFX FXMLController für mehrere FXML? AWT, Swing, JavaFX & SWT 7
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
S JavaFX Mehrere TreeTableView's synchron scrollen AWT, Swing, JavaFX & SWT 0
U Mehrere Oberflächeninstanzen seperat schließen AWT, Swing, JavaFX & SWT 5
J Rahmen um mehrere GUI Einzelteile AWT, Swing, JavaFX & SWT 2
S Layouts, mehrere Buttons nebeneinander AWT, Swing, JavaFX & SWT 2
M Mehrere Fenster innerhalb einer Application AWT, Swing, JavaFX & SWT 3
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
T [LWJGL] mehrere Displays? AWT, Swing, JavaFX & SWT 19
SexyPenny90 Mehrere Fenster AWT, Swing, JavaFX & SWT 2
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
O Swing JLabel mehrere Zeilen AWT, Swing, JavaFX & SWT 2
P mehrere Rectangles per JButton AWT, Swing, JavaFX & SWT 9
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
G Mehrere Layoutprobleme AWT, Swing, JavaFX & SWT 2
Kenan89 JTable mehrere ListSelections AWT, Swing, JavaFX & SWT 2
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
N Mehrere Tasks nacheinander ausführen AWT, Swing, JavaFX & SWT 7
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
M 2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen AWT, Swing, JavaFX & SWT 6
M Mehrere JPanel nacheinander?! AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
K SWT Mehrere Einträge ins Clipboard legen AWT, Swing, JavaFX & SWT 2
C Swing Ein JFrame mehrere Ansichten AWT, Swing, JavaFX & SWT 8
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
S Mehrere JLists - Wie kennzeichnen? AWT, Swing, JavaFX & SWT 2
S Swing MVC Ein JFrame, mehrere JPanels AWT, Swing, JavaFX & SWT 6
J Mehrere JRadioButtons, aber nur 1 darf ausgewählt sein AWT, Swing, JavaFX & SWT 4
L Swing Mehrere Button die selbe Größe AWT, Swing, JavaFX & SWT 4
B AWT mehrere Fenster schließen AWT, Swing, JavaFX & SWT 8
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben