Java Game (Problem mit awt&swing und .setLocation())

tom91

Grünschnabel
HeyLeute!

Ich stehe wieder einmal vor einem unlösbaren Problem für das auch Google anscheinend keine Lösung kennt.
Aber mal von ganz vorne:
Ich bin gerade dabei, mit meinem Projektpartner ein Java Point&Click Adventure Game zu erstellen (Maturaprojekt)
Nun sind wir gerade mitten beim Speichern und Laden von Spielständen.
Nun zu unserem Problem:
Das Game besteht aus einem JPanel. Diesem JPanel wird ein weiteres JPanel untergeordnet. Und diesem JPanel möchte ich ein JTextField hinzufügen. Jedoch wird dieses JTextField nur sichtbar wenn ich mit der Maus auf dieses zuerst unsichtbare JTextField klicke (und dann auch nur teilweise). Mache ich jedoch aus dem JTextField ein TextField, so funktioniert alles Problemlos? Mit einem TextField kann ich jedoch nichts anfangen, da ich ein transparentes TextField benötige.

Problem Nummer 2:
Wir verwenden keinen LayoutManager. Es wird alles Pixelgenau mit .setLocation() (wird im Konstruktor aufgerufen) positioniert und im paint() gezeichnet. Wie ihr im Code sehen könnt wird im paint() alles nochmals positioniert. Der Grund dafür ist der, dass alle Positionen und Größen von Objekten zwischen dem setLocation() im Konstruktor und der paint() Methode verändert werden. Obwohl setLocation nichtmal aufgerufen wird.

Hoffe ihr habt vielleicht eine Lösung zu einem der Probleme?

Code:
package window;

import core.Constants;
import core.Savegame;
import core.Utilities;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import java.util.LinkedList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import sun.font.Font2D;

public class SaveScreen extends JPanel implements MouseListener, MouseMotionListener {

    private int clicked = -1;
    private int aktIndex = 0;
    private Image saveDefault;
    private Image saveBack;
    private Image saveSave;
    private Image pfeilUp;
    private Image pfeilDown;
    private Image newGameSave;
    private Image markedGame;
    private Image line;
    private JPanel pfeilUpPanel;
    private JPanel pfeilDownPanel;
    private JPanel gameSavePanel;
    private JPanel savePanel;
    private JPanel backPanel;
    private JPanel saveGame1;
    private JPanel saveGame2;
    private LinkedList<JPanel> savePanels = new LinkedList<JPanel>();
    private TextField textFieldNewSavegame;
    private String aktivitaet = "default";
    private String aktivitaetSave = "";
    private String[] aktivitaetArray = new String[]{
        "default", "back", "save"
    };
    private Image[] images;
    private LinkedList<Savegame> saves = null;
    Font comicBig= new Font("Comic Sans MS", Font.BOLD, 24);
    Font comicSmall = new Font("Comic Sans MS", Font.TRUETYPE_FONT, 16);

    public SaveScreen() {
        loadPics();

        this.setVisible(true);
        textFieldNewSavegame = new TextField(20);
        textFieldNewSavegame.setEnabled(true);
        textFieldNewSavegame.setFont(comicBig);
        textFieldNewSavegame.setForeground(new Color(26, 17, 87));
        textFieldNewSavegame.setBackground(new Color(189, 201, 244));
        textFieldNewSavegame.setVisible(true);

        pfeilUpPanel = new JPanel();
        pfeilDownPanel = new JPanel();
        gameSavePanel = new JPanel();
        savePanel = new JPanel();
        backPanel = new JPanel();
        saveGame1 = new JPanel();
        saveGame2 = new JPanel();

        pfeilUpPanel.setSize(29, 33);
        pfeilUpPanel.setLocation(101, 105);
        pfeilUpPanel.setVisible(true);
        pfeilUpPanel.addMouseListener(this);

        pfeilDownPanel.setSize(27, 33);
        pfeilDownPanel.setLocation(101, 299);
        pfeilDownPanel.setVisible(true);
        pfeilDownPanel.addMouseListener(this);

        gameSavePanel.setSize(490, 105);
        gameSavePanel.setLocation(145, 370);
        gameSavePanel.setVisible(true);
        gameSavePanel.addMouseListener(this);
        gameSavePanel.addMouseMotionListener(this);

        saveGame1.setSize(490, 105);
        saveGame1.setLocation(145, 110);
        saveGame1.setVisible(true);
        saveGame1.addMouseListener(this);
        saveGame1.addMouseMotionListener(this);

        saveGame2.setSize(490, 105);
        saveGame2.setLocation(145, 240);
        saveGame2.setVisible(true);
        saveGame2.addMouseListener(this);
        saveGame2.addMouseMotionListener(this);

        savePanel.setSize(141, 35);
        savePanel.setLocation(541, 487);
        savePanel.setVisible(true);
        savePanel.addMouseListener(this);
        savePanel.addMouseMotionListener(this);

        backPanel.setSize(36, 30);
        backPanel.setLocation(759, 563);
        backPanel.setVisible(true);
        backPanel.addMouseListener(this);
        backPanel.addMouseMotionListener(this);
        
        this.add(pfeilUpPanel);
        this.add(pfeilDownPanel);
        this.add(gameSavePanel);
        this.add(savePanel);
        this.add(backPanel);
        this.add(saveGame1);
        this.add(saveGame2);
        gameSavePanel.add(textFieldNewSavegame);
        savePanels.add(saveGame1);
        savePanels.add(saveGame2);
        savePanels.add(gameSavePanel);
    }

    private void loadPics() {
        String path = core.Constants.tempPath + "images\\savescreen\\";
        
        saveDefault = getToolkit().getImage(path + "speicherscreenDefault.png").getScaledInstance(800, 600, Image.SCALE_FAST);
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(saveDefault, 0);

        saveBack = getToolkit().getImage(path + "speicherscreenBack.png").getScaledInstance(800, 600, Image.SCALE_FAST);
        mt.addImage(saveBack, 0);

        saveSave = getToolkit().getImage(path + "speicherscreenSave.png").getScaledInstance(800, 600, Image.SCALE_FAST);
        mt.addImage(saveSave, 0);

        pfeilUp = getToolkit().getImage(path + "PfeilUp.png");
        mt.addImage(pfeilUp, 0);

        pfeilDown = getToolkit().getImage(path + "PfeilDown.png");
        mt.addImage(pfeilDown, 0);

        newGameSave = getToolkit().getImage(path + "NeuerSpielstandBild.png");
        mt.addImage(newGameSave, 0);

        markedGame = getToolkit().getImage(path + "MarkierterSpielstand.png");
        mt.addImage(markedGame, 0);

        line = getToolkit().getImage(path + "Trennlinie.png");
        mt.addImage(line, 0);

        try {
            mt.waitForAll(); ///Wartet bis alle Bilder geladen sind
        } catch (Exception e) {
            e.printStackTrace();
        }

        images = new Image[]{
                    saveDefault, saveBack, saveSave
                };
    }

    @Override
    public void paint(Graphics g) {
        
        for (int i = 0; i < aktivitaetArray.length; i++) {
            if (aktivitaetArray[i].equals(aktivitaet)) ///Wenn die aktivitaet in dem aktivitaetsArray vorkommt dann weiß man den Index...
            {
                g.drawImage(images[i], 0, 0, null); ///...Mit diesem kann man sich dann das richtige Bild holen (Da die Reichenfolge mit dem aktivitaetsArray abgestimmt ist und jedes Element des aktivitaetsArrays ein Bild hat
            }
        }
        if ((clicked >= 0) && (clicked <= 2)) {
            g.drawImage(markedGame, savePanels.get(clicked).getX() - 30, savePanels.get(clicked).getY() - 20, null);
        }

        if (aktivitaetSave.equals("newGame") && (clicked != 2)) {
            g.drawImage(markedGame, gameSavePanel.getX() - 30, gameSavePanel.getY() - 20, null);
        } else if (aktivitaetSave.equals("save1") && (clicked != 0)) {
            g.drawImage(markedGame, saveGame1.getX() - 30, saveGame1.getY() - 20, null);
        } else if (aktivitaetSave.equals("save2") && (clicked != 1)) {
            g.drawImage(markedGame, saveGame2.getX() - 30, saveGame2.getY() - 20, null);
        }

        pfeilUpPanel.setLocation(101, 105);
        pfeilUpPanel.setSize(29, 33);
        pfeilDownPanel.setSize(27, 33);
        pfeilDownPanel.setLocation(101, 299);
        gameSavePanel.setSize(490, 105);
        gameSavePanel.setLocation(160, 373);
        this.setLocation(0, 0);
        this.setSize(800, 600);
        savePanel.setSize(141, 35);
        savePanel.setLocation(541, 487);
        backPanel.setSize(36, 30);
        backPanel.setLocation(759, 563);
        textFieldNewSavegame.setLocation(150, 17);
        saveGame1.setSize(490, 105);
        saveGame1.setLocation(160, 105);
        saveGame2.setSize(490, 105);
        saveGame2.setLocation(160, 223);
        g.drawImage(pfeilUp, pfeilUpPanel.getX(), pfeilUpPanel.getY(), null);
        g.drawImage(pfeilDown, pfeilDownPanel.getX(), pfeilDownPanel.getY(), null);
        g.drawImage(newGameSave, gameSavePanel.getX(), gameSavePanel.getY(), null);
        g.setColor(new Color(26, 17, 87));
        if (saves != null) {
            for (int i = 0; i < 2; i++) {
        g.setFont(comicBig);
                g.drawString(saves.get(i).getName(), savePanels.get(i).getX() + 150, savePanels.get(i).getY() + 35);
                g.setFont(comicSmall);
                g.drawString(Savegame.dateFormat.format(saves.get(i).getCreate()), savePanels.get(i).getX() + 175, savePanels.get(i).getY() + 65);
                g.drawImage(saves.get(i).getScreen(), savePanels.get(i).getX(), savePanels.get(i).getY(), null);
            }
        }
        g.drawImage(line, 147, 343, null);

    }

    public void refreshSaves() {
        this.saves = Utilities.getSaveGames(Constants.tempPath + "save");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        Component sender = e.getComponent();
        if (sender == backPanel) {
            //this.setVisible(false);
            core.Constants.GameScreen.setActiveGamePanel(GamePanel.Menue);
        } else if (sender == gameSavePanel) {
            clicked = 2;
            System.out.println("Neuer Spielstand");
        } else if (sender == savePanel) {
            Savegame save;
            System.out.println("Wird gespeichert");
            if (clicked != 2) {
                int selectedValue = JOptionPane.showConfirmDialog(this, "Möchten Sie den Spielstand \"" + saves.get(clicked).getName() + "\" überschreiben?", "Question", JOptionPane.YES_NO_OPTION);
                if (selectedValue == JOptionPane.NO_OPTION) {
                    return;
                }
                save = new Savegame(saves.get(clicked).getName(), true);
            }
            else
            {
                save = new Savegame(textFieldNewSavegame.getText(), true);
            }
            save.save();
            refreshSaves();
            
        } else if (sender == saveGame1) {
            clicked = 0;
        } else if (sender == saveGame2) {
            clicked = 1;
        }
        else if (sender == pfeilDownPanel)
        {
            saves.addLast(saves.getFirst());
            saves.pollFirst();
        }
        else if (sender == pfeilUpPanel)
        {
            saves.addFirst(saves.getLast());
            saves.pollLast();
        }
        repaint();
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {

        Component sender = arg0.getComponent();
        
        if (sender == gameSavePanel) {
            aktivitaetSave = "newGame";
            aktivitaet = "default";
        } else if (sender == savePanel) {
            aktivitaet = "save";
        } else if (sender == backPanel) {
            aktivitaet = "back";
        } else if (sender == saveGame1) {
            aktivitaetSave = "save1";
            aktivitaet = "default";
        } else if (sender == saveGame2) {
            aktivitaetSave = "save2";
            aktivitaet = "default";
        }
        repaint();

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        Component sender = arg0.getComponent();
        if ((sender == gameSavePanel) || (sender == savePanel) || (sender == backPanel) || (sender == saveGame1) || (sender == saveGame2)) {
            aktivitaet = "default";
            aktivitaetSave = "";
        }
        repaint();
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }
}

jaaa ich weiß...kommentare wären nicht schlecht ;)
 
Zurück