Hallihallöle,
ich habe mich in letzter Zeit intensiv mit der Graphischen Oberfläche mit Canvas beschäftigt und bin auf eine Sache gestoßen, die mich ziemlich nervt.
Ich habe ein JFrame erschaffen, mein Fenster in welchem das Programm läuft und darauf ist ein Canvas, was 100% der Fläche einnimmt.
Nun möchte ich gerne genau die Mitte treffen, weil ich ausgehend von selbiger weiterarbeiten möchte.
Leider ist es mir nie möglich gewesen die Mitte zu finden, obwohl ich es immer genau eingegeben habe…
Meine Hauptklasse sieht so aus, man ignoriere mal das Zeuchs drumherum:
import java.awt.Canvas;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
public class CafeMain {
protected static String OS = System.getProperty("os.name").toLowerCase();
protected static String spielname = "Café International";
protected static String[] spielername = new String[2];
protected static List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
protected static List<Laenderkarte> laenderkarten = new ArrayList<Laenderkarte>();
protected static int anzahlbarplaetze = 21;
protected static int[] punktespieler = new int[2];
protected static int spieler = 1;
protected static List<Gastkarte> kartenspieler1 = new ArrayList<Gastkarte>();
protected static List<Gastkarte> kartenspieler2 = new ArrayList<Gastkarte>();
protected static String filepath = new File("").getAbsolutePath();
protected static Canvas spielfeld = new Canvas() {
public void paint(Graphics stift) {
Spielfeld.zeichne(stift);
}
};
protected static List<Tisch> tische = new ArrayList<Tisch>(12);
protected static List<Stuhl> stuehle = new ArrayList<Stuhl>(24);
protected static boolean spielernamenkorrekt = false;
protected static JFrame spielframe = new JFrame(spielname);
protected static int frameWidth, frameHeight;
public CafeMain() throws IOException {
frameWidth = 600;
frameHeight = 600;
spielframe.setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - spielframe.getSize().width) / 2;
int y = (d.height - spielframe.getSize().height) / 2;
spielframe.setLocation(x, y);
spielframe.setResizable(false);
spielframe.setLocationRelativeTo(null);
spielframe.setVisible(false);
spielframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// === Komponenten ===
Container cp = spielframe.getContentPane();
cp.setLayout(null);
spielfeld.setBounds(0, 0, spielframe.getWidth(), spielframe.getHeight());
cp.add(spielfeld);
// === Komponenten ===
ablauf();
}
public static void ablauf() {
if(SysWin()) {
JOptionPane.showMessageDialog(null, "Dein System ist hoffnungslos veraltet!
Windoof ist nicht kompatibel mit diesem Spiel.
Sollte es zu Problemen bei der Ausführung kommen,
dann öffne das Spiel bitte auf einem PC
mit Mac OS oder Linux!", "System veraltet", JOptionPane.WARNING_MESSAGE);
}
do{
Spielstart.namensfrage();
} while(spielernamenkorrekt == false);
spielframe.setVisible(true);
Spielstart.gastkartenmischen();
Spielstart.laenderkartenmischen();
Spielstart.spielfeldgenerieren();
}
public static void main(String[] args) throws IOException {
new CafeMain();
}
public static boolean SysWin() {
return (OS.indexOf("win") >= 0);
}
}
dann später habe ich zur Kontrolle eine Linie in alle 4 Richtungen gezeichnet, die dann gleichmäßig verteilt nahe der Ecken ankommen muss:
stift.drawLine(frameWidth/2, frameHeight/2, (frameWidth/2)+k, (frameHeight/2)+k);
stift.drawLine(frameWidth/2, frameHeight/2, (frameWidth/2)-k, (frameHeight/2)+k);
stift.drawLine(frameWidth/2, frameHeight/2, (frameWidth/2)+k, (frameHeight/2)-k);
stift.drawLine(frameWidth/2, frameHeight/2, (frameWidth/2)-k, (frameHeight/2)-k);```
So sieht dann das Resultat aus:
Wie man sieht, ist die Mitte auf der y-Achse sehr unnötig verschoben.
Das liegt, wie ich es denke daran, dass das böse Java auch die Titelleiste des JFrames mit zur Größe hinzuzieht.
Kann mir jemand codetechnisch erläutern, wie ich das verhindere und ein bestmögliches Ergebnis erziele?
Vielen Dank
Lukas :)