Optimierung bzw. verschönerung des Quellcodes

Strongbow

Mitglied
Hallo Leute, da ich noch nicht so viel Kenntnisse beim Java programmieren habe, bin ich noch nicht so flexibel, wenn es darum geht das erstellte Programm einfacher und optimierter umzustellen.

Ich hoffe ihr könnt mir helfen, mein Programm schöner zu gestalten.

:)



Java:
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

class ImageHandler extends Frame {

private Canvas myIC;
private String filename = "/germany.gif";
private String command = "G";


ImageHandler(){

myIC = new Canvas();
myIC.setPreferredSize(new Dimension(295, 300));
add(myIC);

GridBagLayout gbl = new GridBagLayout();
this.setLayout(gbl);

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.BOTH; // wie Komponente Bereich füllen soll
c.weightx = 10; // Breite
c.weighty = 10; // Höhe
c.insets = new Insets(0,5,10,15);

Button bG = new Button("Germany");
bG.setActionCommand("G");
bG.addActionListener(new BHandler() );
add(bG);

Button bI = new Button("Italy");
bI.setActionCommand("I");
bI.addActionListener(new BHandler() );
add(bI);

Button bE = new Button("England");
bE.setActionCommand("E");
bE.addActionListener(new BHandler() );
add(bE);

c.gridx = 0; // x-Position
c.gridy = -1; // y-Position
c.gridwidth = 1; // Breite
c.gridheight = 1; // Höhe
gbl.setConstraints(bG, c); // zum GridBagConstraints hinzufgen


c.gridx = 0;
c.gridy = -3;
c.gridwidth = 1;
c.gridheight = 1;
gbl.setConstraints(bI, c);


c.gridx = 0;
c.gridy = -6;
c.gridwidth = 1;
c.gridheight = 1;
gbl.setConstraints(bE, c);




addWindowListener(new WindowAdapter ( ){
public void windowClosing(WindowEvent e){
System.exit(0);
}
} );


setTitle ("A Flag");
setSize (360, 500);
setVisible (true);
setBackground(Color.gray);
}

public void paint(Graphics g){
super.paint(g);
drawFlag();
}

public void drawFlag(){

Image FlaggenBild = null ;

URL url = null;
Graphics myFG = myIC.getGraphics();

try{

url = new URL("File:///" + System.getProperty("user.home") + filename);
FlaggenBild = getToolkit().getImage(url);
setIconImage(FlaggenBild);
}catch (Exception e){
e.printStackTrace();

}
if (url != null && FlaggenBild != null){
Insets insets = getInsets();
int x = insets.left;
int y = insets.top;
int w = FlaggenBild.getWidth(this);
int h = FlaggenBild.getHeight(this);

myFG.drawImage(FlaggenBild, x, y, this);
}
}


class BHandler implements ActionListener {
public void actionPerformed(ActionEvent evt) {
Toolkit.getDefaultToolkit().beep();
command = evt.getActionCommand();
if (command.equalsIgnoreCase("G")) {
filename = "/germany.gif";
drawFlag();

} else if (command.equalsIgnoreCase("E")) {

filename = "/england.gif";
drawFlag();

}

else if (command.equalsIgnoreCase("I")) {

filename = "/italy.gif";
drawFlag();


}
ImageHandler.this.invalidate();
ImageHandler.this.validate();

}
}


public static void main (String [] args){
new ImageHandler ();

}
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
in einem so kurzen Programm steckt nicht viel zu optimieren drin,
ein bisschen:
da BHandler nur den drei Buttons zugeornet ist, müsste in jedem Fall ein filename zu bestimmen sein,
der drawFlag()-Aufruf im Listener könnte nur einmal hinter dem if/else stehen statt 3x

die Zeilen 45-63 könnten gekürzt werden, wenn es eine Methode dazu gibt,
initButton(gbl,bG,0,-1,1,1);

einen Fehler finde ich dann noch:
NIE getGraphics() aufrufen, sondern paint() überschreiben, wenn es richtig korrekt werden soll (paintComponent() in Swing),
jedes einzelne Lehrbuch-Beispiel zum Zeichnen zeigt das, gar keins angeschaut?

wobei die dich dann meist eh auf Swing mit JPanel statt AWT mit Panel/ Canvas umleiten
http://www.java-forum.org/awt-swing-swt/78199-zeichnen-awt-canvas.html
Galileo Computing :: Java ist auch eine Insel – 20 Grafikprogrammierung
 

fastjack

Top Contributor
1. Dein ImageHandler kann gleich einen ActionListener implementieren, so sparst Du Dir die Klasse BHandler.
2. Die Buttons kannst Du als Membervariable definieren.
3. Für die Buttonblöcke (setXXX und die GridConstraings) kannst Du eigene Methoden erstellen. Bsp.: initButtonEngland(...) usw.
4. Die Methode drawFlad liest und malt. Die würde ich aufteilen. Außerdem kannst Du bestimmt gelesene Image cachen und brauchst es nicht immer wieder lesen. Außerdem brauchst Du auch nicht extra x und y auf insets.XXX zusetzen. h und w werden erst gar nicht benutzt, sind als überflüssig definiert.
5. Der else/if Zweig im BHandler müßte sich eigentlich durch die obigen "Verschönerungen" stark vereinfachen. Der ganze Zweig läßt sich auch in eine Factory auslagern, dann ist er komplett weg.
 
B

bone2

Gast
schöner wirds schon durch einheitliche einrückung und leerzeilen.
und gib dem konstruktor ruhig eine sichtbarkeit
 

Strongbow

Mitglied
Hi Leute ich habe jetzt versucht meinen Buttons in Checkboxen bzw. JRadioButtons zu ändern, doch wenn ich einen anderen Knopf drücke bleibt der vorrige gedrückt!

was ist bei meinen Code falsch?

Java:
import java.awt.*;
import java.awt.event.*;

import static java.awt.GridBagConstraints.*;
import java.net.*;
import java.util.logging.*;

import javax.swing.JRadioButton;

public class ImageHandler4 {

private final Frame window;
private final Canvas myIC;
private final JRadioButton bG, bI, bE;
private Image flaggenBild;

public ImageHandler4 () {

window = new Frame("A Flag");
myIC = new ImageCanvas();
bG = new JRadioButton("Germany");
bI = new JRadioButton("Italy");
bE = new JRadioButton("England");

BHandler bHandler = new BHandler();

bG.setActionCommand("G");
bG.addActionListener(bHandler);
bI.setActionCommand("I");
bI.addActionListener(bHandler);
bE.setActionCommand("E");
bE.addActionListener(bHandler);

window.setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();
c.fill = BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = new Insets(10, 20, 10, 20);
c.gridx = 1;
c.gridy = 1;
window.add(myIC, c);

c = new GridBagConstraints();
c.fill = BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = new Insets(5, 5, 5, 5);
c.gridx = 1;
c.gridy = 2;
window.add(bG, c);

c = new GridBagConstraints();
c.fill = BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = new Insets(5, 5, 5, 5);
c.gridx = 1;
c.gridy = 3;
window.add(bI, c);

c = new GridBagConstraints();
c.fill = BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.insets = new Insets(5, 5, 5, 5);
c.gridx = 1;
c.gridy = 4;
window.add(bE, c);

window.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(final WindowEvent e) {
System.exit(0);
}
});
window.pack();
window.setLocationRelativeTo(null);
window.setBackground(Color.gray);
window.setVisible(true);

}

public void loadImage(final String filename) {
try {
URL url = new URL("File:///" + System.getProperty("user.home") + filename);
flaggenBild = window.getToolkit().getImage(url);
window.setIconImage(flaggenBild);
myIC.repaint();
} catch (final MalformedURLException ex) {
Logger.getLogger(ImageHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}

private class BHandler implements ActionListener {

public void actionPerformed(final ActionEvent evt) {
Toolkit.getDefaultToolkit().beep();
String command = evt.getActionCommand();
if (command.equalsIgnoreCase("G")) {
loadImage("/germany.gif");
} else if (command.equalsIgnoreCase("E")) {
loadImage("/england.gif");
} else if (command.equalsIgnoreCase("I")) {
loadImage("/italy.gif");
}
}
}

private class ImageCanvas extends Canvas {

ImageCanvas() {
setPreferredSize(new Dimension(248, 300));

}

@Override
public void paint(final Graphics g) {
super.paint(g);
if (flaggenBild != null) {
Insets insets = window.getInsets();
int x = insets.left;
int y = insets.top;
g.drawImage(flaggenBild, x, y, this);
}
}
}

public static void main(final String[] args) {
Runnable gui = new Runnable() {

public void run() {
ImageHandler4 imageHandler4 = new ImageHandler4();
imageHandler4.loadImage("/germany.gif");
}
};

EventQueue.invokeLater(gui);
}
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
in der Tat ziemlich frech, und gerade so noch innerhalb der 24 Stunden-Grenze,
ich habe die Posts wiederhergestellt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
B Stabzerlegungsproblem / Optimierung Java Basics - Anfänger-Themen 31
CptK Optimierung von Flächen Java Basics - Anfänger-Themen 9
Y "Optimierung" des Codes Java Basics - Anfänger-Themen 14
T Auslesen der Zwischenablage - Optimierung Geschwindigkeit Java Basics - Anfänger-Themen 6
M Code Optimierung - Verbesserungen Java Basics - Anfänger-Themen 10
F code Optimierung (Bin-Hex-Bytes) Java Basics - Anfänger-Themen 9
A Frage zur Laufzeit / Optimierung Java Basics - Anfänger-Themen 2
P JUnit - Optimierung der Testklassen Java Basics - Anfänger-Themen 13
-horn- "Berechnung vorwärts, Optimierung rückwärts?" - Wie würdet ihr das machen? Java Basics - Anfänger-Themen 8
T synchronisations-optimierung Java Basics - Anfänger-Themen 2
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
C Javafunktion zur Abfrage eines Quellcodes Java Basics - Anfänger-Themen 15
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
S Problem beim Verstehen des Quellcodes Java Basics - Anfänger-Themen 7
F Wie kann man Quellcodes uber die Konsole laufen lassen? Java Basics - Anfänger-Themen 6
T .für Anfänger - Struktur des Quellcodes in Java? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben