AWT und Graphikfehler

daWonderer

Aktives Mitglied
Fehlerhafte Graphikausgabe beim Switchen zwischen 2 verschiedenen Programm-Modi.

Ich habe auch versucht nach dem Switch mit 'repaint' oder 'update' etwas zu erreichen, aber ohne Erfolg :(

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Created with IntelliJ IDEA.
 * User: wonderer
 * Date: 19.08.12
 * Time: 11:31
 * To change this template use File | Settings | File Templates.
 */
public class MainForm extends Frame {

    private Button btSwitchToFunc1;
    private Button btSwitchToFunc2;
    private Dimension func1Dimension;
    private Dimension func2Dimension;
    private Dimension scrSize;
    private Panel mainPanel;
    private Panel centerPanel;
    private Panel southPanel;

    public MainForm(){
        initFrame();
        this.setVisible(true);
    }
    public void initFrame(){
        // set vars
        scrSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        func2Dimension = new Dimension(500,750);
        func1Dimension = new Dimension(350,350);
        // init frame
        this.setSize(libDimension);
        this.setLocation(new Point(scrSize.width/2-func2Dimension.width/2,scrSize.height/2-func2Dimension.height/2));
        // init components
        btSwitchToFunc1 = new Button("switch to 1");
        btSwitchToFunc2 = new Button("switch to 2");
        btSwitchToFunc1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                Button btSwitch = (Button)actionEvent.getSource();
                MainForm parentFrame = (MainForm)btSwitch.getParent().getParent();
                parentFrame.switchFunction(btSwitch);
            }
        });
        btSwitchToFunc2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                Button btSwitch = (Button)actionEvent.getSource();
                MainForm parentFrame = (MainForm)btSwitch.getParent().getParent();
                parentFrame.switchFunction(btSwitch);
            }
        });
        selectSome = new Choice();
        selectSome.addItem("1");
        selectSome.addItem("3");
        Label lblSelect = new Label("Label: ");
        // add components
        mainPanel = new Panel();
        this.add(mainPanel);
        mainPanel.setLayout(new BorderLayout());
        mainPanel.add(btSwitchToFunc1, BorderLayout.NORTH);
        centerPanel = new Panel();
        centerPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        centerPanel.setSize(new Dimension(500,250));
        Panel dumPan = new Panel();
        dumPan.setLayout(new FlowLayout(FlowLayout.RIGHT));
        dumPan.setPreferredSize(new Dimension(240, 42));
        dumPan.add(lblSelect);
        lblSelect.setPreferredSize(new Dimension(182, 42));
        centerPanel.add(dumPan);
        dumPan = new Panel();
        dumPan.setLayout(new FlowLayout(FlowLayout.LEFT));
        dumPan.setPreferredSize(new Dimension(240, 42));
        int cntPanWidth = centerPanel.getSize().width;
        selectSome.setPreferredSize(new Dimension(165, 42));
        dumPan.add(selectSome);
        centerPanel.add(dumPan);
        mainPanel.add(centerPanel, BorderLayout.CENTER);
    }
    public void switchFunction(Button btActualFunction){
        //System.out.println(northPanel.getComponentCount());
        //Button btActualFunction = (Button)mainPanel.getComponent(0);
        if( btActualFunction.getLabel().equals("switch to 1")) {
            this.setSize(func1Dimension);
            this.setLocation(scrSize.width-func1Dimension.width,this.getLocation().y);
            mainPanel.remove(btSwitchToFunc1);
            mainPanel.remove(centerPanel);
            mainPanel.add(btSwitchToFunc2, BorderLayout.NORTH);
        } else {
            this.setSize(func2Dimension);
            this.setLocation(new Point(scrSize.width / 2 - libDimension.width / 2, scrSize.height / 2 - libDimension.height / 2));
            //btSwitchFunction.setLabel("switch to education");
            mainPanel.remove(btSwitchToFunc2);
            mainPanel.add(centerPanel, BorderLayout.CENTER);
            mainPanel.add(btSwitchToFunc1, BorderLayout.NORTH);
        }
        this.repaint();
        //btSwitch.repaint();
        //paFrame.update(paFrame.getGraphics());
    }
    static class TestWindowListener extends WindowAdapter
    {
        public void windowClosing(WindowEvent e)
        {
            e.getWindow().dispose();                
            System.exit(0);                            
        }
    }
    public static void main( String[] args ){
        MainForm myForm = new MainForm();
        myForm.addWindowListener(new TestWindowListener());
    }
}

Grüße aus Sachsen und Danke schon mal für die Hilfe!
 

Michael...

Top Contributor
Für solche schwerwiegenden Änderungen am Layout reicht ein repaint() nicht aus. Kann man das denn nicht mit einem CardLayout lösen?
Ansonsten: validate()
 

daWonderer

Aktives Mitglied
hmm... 'validate' hat keine positive Veränderung gebracht.

Das CardLayout hab ich jetzt mal zum Testen zu BorderLayout.SOUTH hinzugefügt, aber da seh ich beim Öffnen des Frames nichts von!?

angehängt an Methode 'initFrame':
Java:
dumPan = new Panel();
dumPan.setLayout( new CardLayout());
dumPan.add(new Panel(),"card name 1");
dumPan.add(new Panel(),"card name 2");
mainPanel.add(dumPan, BorderLayout.SOUTH);

Zum Testen weil ich nicht weiß wie sich die Tabs verhalten beim Verkleinern des Fensters.
 

Michael...

Top Contributor
hmm... 'validate' hat keine positive Veränderung gebracht.
Muss auch an der richtigen Stelle auf der richtigen Komponete aufgerufen werden.
Das CardLayout hab ich jetzt mal zum Testen zu BorderLayout.SOUTH hinzugefügt, aber da seh ich beim Öffnen des Frames nichts von!?

angehängt an Methode 'initFrame':
Java:
dumPan = new Panel();
        dumPan.setLayout( new CardLayout());
        dumPan.add(new Panel(),"card name 1");
        dumPan.add(new Panel(),"card name 2");
        mainPanel.add(dumPan, BorderLayout.SOUTH);

Zum Testen weil ich nicht weiß wie sich die Tabs verhalten beim Verkleinern des Fensters.
1. sind die Panels leer
2. sind 0x0 groß
==> da kann man nicht viel sehen

Dabei fällt mir auf: Warum arbeitest Du mit AWT, warum nicht Swing?
 

daWonderer

Aktives Mitglied
Muss auch an der richtigen Stelle auf der richtigen Komponete aufgerufen werden.
Der Aufruf den ich eingefügt habe steht am Ende der 'switchFunction' Methode (this.validate(); )

Oh, da pack ich mal was rein in die Panels zum Testen :D

Dabei fällt mir auf: Warum arbeitest Du mit AWT, warum nicht Swing?

Weil ich nicht weiß wie ich Swing-Komponenten threadsicher machen kann..
 

daWonderer

Aktives Mitglied
@KingOfExceptions

Nee ne!? Du willst mir jetzt nich wirklich sagen, dass man mit diesen 4 Zeilen den Nachteil der bei Galileocomputing beschrieben ist wegrationalisiert?

Wie genau verwende ich diese Syntax im Zusammenhang mit einer Componente?
(ein Link genügt oder der Hinweis auf Google :) )

@Michael

Ich sehe gerade ich kann das CardLayout nehmen - da gibts ja gar keine Tabs wie ich dachte. Danke!
 

daWonderer

Aktives Mitglied

xehpuk

Top Contributor
Galileo zumindest meint thread-sicherererer als Swing :D
Das ist ja mal eine Aussage! :D
AWT war als thread-safe geplant. Es hat sich aber später herausgestellt, dass es das nicht wirklich ist: Multithreaded toolkits: A failed dream? | Java.net

Selbst wenn es so wäre, wäre dies kein richtiges Argument für AWT.

Ist der auch für diesen Bug zuständig den ich gerade hab im IntelliJ?
key.event.bug.intellij.png - Bilder und Fotos kostenlos auf ImageBanana hochladen
Was es damit auf sich hat, keine Ahnung. Scheint ein Bug in der IDE zu sein. Und wie der ausgelöst wird, kann ich auch nicht sagen. Dafür müsste ich mich wohl erst einige Zeit in den Source-Code von IntelliJ IDEA einarbeiten. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Graphikfehler Swing AWT, Swing, JavaFX & SWT 6
S JTree / problem / graphikfehler AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben