Ich bin gerade dabei, eine grafische Oberfläche in swing zu programmieren. Es handelt sich um eine einfach Oberfläche, diese hat einen Butten namens "choose", wird dieser gedrückt, dann öffnet sich ein FileChooser, mit der man Bilddateien öffnen kann. Wenn man doch kein Bild öffnen will, dann soll eben die ursprüngliche Oberfläche mit ihren Knöpfen hergestellt werden. Dies passiert manchmal - manchmal aber auch nicht, ein Fehler, den ich als Threadproblem identifiziert habe, aber nicht lösen konnte. Hier die Mainmethode...
So so sieht die showGUI-Methode aus:
scalingImage(); ist dafür zuständig, das Bild zu skalieren, wenn es zu groß ist - das Problem liegt in graphicDesign(); Dort wird die GUI zusammengesetzt, und es gibt Buttons, die ActionListenr haben:
Wenn nun ein Actionevent fliegt, dann ist hier der ActionListener:
Ich verstehe Folgendes nicht. Wieso schafft es der Einsatz von SwingUtilities.invokeLater nicht, dafür zu sorgen, dass erst dies:
... und dann erst showGUI ausgeführt wird, sodass ich, wenn ich den FileChoser öffne und dann aber auf abbrechen gehe, wieder die ursprüngliche Oberfläche mit allen Buttons zu sehen ist. Den Code habe ich mal anbei als Anhang hochgeladen.
Code:
public static void main(String[] args) { MainFrame m = new MainFrame(); m.showGUI(); }
Code:
public void showGUI() { setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); scalingImage(); graphicDesign(); }
Code:
private void graphicDesign() { iconBox = Box.createHorizontalBox(); imgicon = new JLabel(imageinfo.getimageIcon()); iconBox.add(imgicon); GridLayout grButtonPane = new GridLayout(2,0); buttonPane = new JPanel(); buttonPane.setLayout(grButtonPane); btnChoose = new Button("choose"); btnChoose.addActionListener(this); btnCancel = new Button("cancel"); btnCancel.addActionListener(this); FlowLayout flButtonPane = new FlowLayout(); buttons = new JPanel(); buttons.setLayout(flButtonPane); buttons.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); buttons.add(btnChoose); buttons.add(btnCancel); btnPrevious = new Button("previous"); btnNext = new Button("next"); btnRotate = new Button("rotate"); changebuttons = new JPanel(); changebuttons.setLayout(flButtonPane); changebuttons.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); changebuttons.add(btnPrevious); changebuttons.add(btnNext); changebuttons.add(btnRotate); buttonPane.add(buttons); buttonPane.add(changebuttons); add(iconBox); add(buttonPane); }
Code:
@Override public void actionPerformed(ActionEvent ae) { if(ae.getSource()== btnChoose){ defaultLoader = new Loader(); selectedF = defaultLoader.initialize(); imageIcon = new ImageIcon(selectedF); imageinfo.setNewData(imageIcon); }else if(ae.getSource()== btnCancel){ System.exit(0); } t = new Thread() { public void run() { clear(); } private void clear() { getContentPane().remove(iconBox); getContentPane().remove(buttonPane); revalidate(); repaint(); update(); } private void update() { SwingUtilities.invokeLater(new Runnable() { public void run() { showGUI(); } }); } }; t.start(); }
Code:
getContentPane().remove(iconBox); getContentPane().remove(buttonPane); revalidate(); repaint(); update();
Comment