BorderLayout JPanel liegt nicht richtig an

Maicus

Mitglied
Guten Mittag,

ich habe ein mit dem BorderLayout bei JFrame ich versuche ein JPanel rechts an ein JFrame anzubinden. Doch wenn ich frame.add(JPanel, LINE_END) mach funktioniert es nicht und es bindet sich oben links.

[Java]
public void neueFlaeche(String name, int height, int width, String position)
{
/*if(position.equals("Mitte")*/ShowCanvas Flaeche = new ShowCanvas(height, width);
ImageContainer background = new ImageContainer();
background.loadImage("images/sunw02.jpg");
//Flaeche.setBackgroundImage(background);

add(Flaeche, BorderLayout.PAGE_START);

repaint();

}
[/Java]

[Java]
class ShowCanvas extends JPanel
{
ImageContainer background;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
setBackground(Color.black);
width = nwidth;
height = nheight;
setSize(width, height);
//addMouseMotionListener(new MouseMotionHandler());

}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
if(background!=null)
g2D.drawImage(background.getBufferedImage(),0,0, this);
}

class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}

public void mouseMoved(MouseEvent e) {
}
}

public void setBackgroundImage (ImageContainer back)
{
background = back;
background.rescaleImage(width, height);
repaint();

}
}
[/Java]

Ich hoffe Ihr findet die Lösung

Schonmal danke im voraus
 
Wow, hast du eigentlich irgendetwas über GUIs in Java mal gelesen bzw. ein simples Tutorial gemacht? Anstatt des codes den du gepostet hast hättest du auch ein trollface posten können.
 
Sry,
ich hab grad gsehn das ich schwachsinn gepostet hab,
naja auf jedenfall es steht nicht Page_start sondern line_end drinnen.

Und trotzdem hängt das bild oben links.

Den ganzen Code:
[Java]

//Forum: http://www.java-forum.org/java-basi...rexception-beim-laden-bildern.html#post910388


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.border.TitledBorder;
import java.io.*;
import javax.imageio.*;
import java.net.*;


/*
* Marcus Janiks Engine zur einfach Erstellung von einfachen Grafischen Anwendung unter Bentzung von Swing
*/
public class Leinwand extends JFrame implements ActionListener
{

boolean areaActivated[] = new boolean[5];
/* public static void main() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Leinwand app = new Leinwand();
app.setVisible(true);
}
});
}*/
{}


Leinwand(String Titel, int breite, int hoehe)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(Titel);

setSize(breite, hoehe);

setResizable(false);
setVisible(true);

}

public void actionPerformed(ActionEvent e)
{
//actions have to be handled here
}

public void neueFlaeche(String name, int height, int width, String position)
{
/*if(position.equals("Mitte")*/ShowCanvas Flaeche = new ShowCanvas(height, width);
ImageContainer background = new ImageContainer();
background.loadImage("images/sunw02.jpg");
//Flaeche.setBackgroundImage(background);

add(Flaeche, BorderLayout.LINE_END);

repaint();

}


}

class ImageContainer
{
String Description;
BufferedImage image, originalImage;
ImageIcon icon;
int width, height;
int type;

ImageContainer()
{
Description = "Standard";
image = null;
originalImage = null;
width = 0;
height = 0;
type = 0;
icon = null;
}

public void loadImage(String path)
{
try
{
java.net.URL imgURL = getClass().getResource(path);
this.image = ImageIO.read(imgURL);
}
catch(MalformedURLException e)
{
System.out.println("URLEXCEPTION!");
e.printStackTrace();
}
catch(IOException e)
{
System.out.println("Bild");
}
width = image.getWidth();
height = image.getHeight();
type = image.getType();

originalImage = image;
}

public void resetImage()
{
image = originalImage;
}

public ImageIcon getImageIcon()
{
if(icon == null)
{
icon = new ImageIcon(image);
}
return icon;
}

public BufferedImage getBufferedImage()
{
return image;
}

public void rescaleImage(int w, int h)
{
BufferedImage resizedImage = new BufferedImage(w, h, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, w, h, null);
g.dispose();
g.setComposite(AlphaComposite.Src);

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
icon = new ImageIcon(resizedImage);
image = resizedImage;
}
}

class ShowCanvas extends JPanel
{
ImageContainer background;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
setBackground(Color.black);
width = nwidth;
height = nheight;
setSize(width, height);
//addMouseMotionListener(new MouseMotionHandler());

}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
if(background!=null)
g2D.drawImage(background.getBufferedImage(),0,0, this);
}

class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}

public void mouseMoved(MouseEvent e) {
}
}

public void setBackgroundImage (ImageContainer back)
{
background = back;
background.rescaleImage(width, height);
repaint();

}
}

class GameTimer
{

private final int NANOSECONDS = 1000000000;

private boolean timerStarted;
private long beginTime, time, timeDifference;

public GameTimer()
{
timerStarted = false;
beginTime = 0;
time = 0;
timeDifference = 0;

}

public void start()
{

timerStarted = true;
beginTime = System.nanoTime();

}

public void stop()
{
timerStarted = false;
beginTime = 0;

}

public int get()
{
time = System.nanoTime();
timeDifference = time - beginTime;
beginTime = time;

return (int)timeDifference;
}

}
[/Java]
 
Ich hänge immer noch bei meinem Problem,
meiner Meinung nach muss man einfach ein jpanel mit der add Methode mit BorderLayout.LINE_END aufrufen, damit es sich rechts bindet, hab ich da was verpennt oder was hab ich falsch gemacht?
 
versuche
validate();
nach dem add() vor dem repaint(),
um das Layout neu berechnen zu lassen

neueFlaeche() wird im geposteten Code allerdings nie aufgerufen und du solltest nicht mit Bildern hantieren, die niemand testen kann,
stelle doch temporär fürs Forum auf Anzeige eines simplen Textes um,
und poste ein vollständiges Testprogramm + Bedienungshinweis, falls nicht alles von Timern automation abläuft
 
Nach dem validate kommt überhaupt nichts mehr. (Auch wenn ich Validate() wieder wegmach )

Hier sind die beiden Texte:

[Java]


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.border.TitledBorder;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class Leinwand extends JFrame implements ActionListener
{

boolean areaActivated[] = new boolean[5];
/* public static void main() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Leinwand app = new Leinwand();
app.setVisible(true);
}
});
}*/
{}


Leinwand(String Titel, int breite, int hoehe)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(Titel);

setSize(breite, hoehe);

setResizable(false);
setVisible(true);

}

public void actionPerformed(ActionEvent e)
{
//actions have to be handled here
}

public void neueFlaeche(String name, int height, int width, String position)
{
/*if(position.equals("Mitte")*/ShowCanvas Flaeche = new ShowCanvas(height, width);
ImageContainer background = new ImageContainer();
//background.loadImage("images/sunw02.jpg");
//Flaeche.setBackgroundImage(background);

add(Flaeche, BorderLayout.LINE_END);

//validate();

repaint();

}


}

class ImageContainer
{
String Description;
BufferedImage image, originalImage;
ImageIcon icon;
int width, height;
int type;

ImageContainer()
{
Description = "Standard";
image = null;
originalImage = null;
width = 0;
height = 0;
type = 0;
icon = null;
}

public void loadImage(String path)
{
try
{
java.net.URL imgURL = getClass().getResource(path);
this.image = ImageIO.read(imgURL);
}
catch(MalformedURLException e)
{
System.out.println("URLEXCEPTION!");
e.printStackTrace();
}
catch(IOException e)
{
System.out.println("Bild");
}
width = image.getWidth();
height = image.getHeight();
type = image.getType();

originalImage = image;
}

public void resetImage()
{
image = originalImage;
}

public ImageIcon getImageIcon()
{
if(icon == null)
{
icon = new ImageIcon(image);
}
return icon;
}

public BufferedImage getBufferedImage()
{
return image;
}

public void rescaleImage(int w, int h)
{
BufferedImage resizedImage = new BufferedImage(w, h, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, w, h, null);
g.dispose();
g.setComposite(AlphaComposite.Src);

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
icon = new ImageIcon(resizedImage);
image = resizedImage;
}
}

class ShowCanvas extends JPanel
{
ImageContainer background;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
setBackground(Color.black);
width = nwidth;
height = nheight;
setSize(width, height);
//addMouseMotionListener(new MouseMotionHandler());

}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
if(background!=null)
g2D.drawImage(background.getBufferedImage(),0,0, this);
}

class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}

public void mouseMoved(MouseEvent e) {
}
}

public void setBackgroundImage (ImageContainer back)
{
background = back;
background.rescaleImage(width, height);
repaint();

}
}

class GameTimer
{

private final int NANOSECONDS = 1000000000;

private boolean timerStarted;
private long beginTime, time, timeDifference;

public GameTimer()
{
timerStarted = false;
beginTime = 0;
time = 0;
timeDifference = 0;

}

public void start()
{

timerStarted = true;
beginTime = System.nanoTime();

}

public void stop()
{
timerStarted = false;
beginTime = 0;

}

public int get()
{
time = System.nanoTime();
timeDifference = time - beginTime;
beginTime = time;

return (int)timeDifference;
}

}







class EinfachVerketteteListe {

ListElement startElem = new ListElement("Kopf");

public EinfachVerketteteListe() {}

public void addLast(Object o){
ListElement newElem = new ListElement(o);
ListElement lastElem = getLastElem();
lastElem.setNextElem(newElem);
}

public void insertAfter(Object prevItem, Object newItem) {
ListElement newElem, nextElem, pointerElem;
pointerElem = startElem.getNextElem();
while(pointerElem != null && !pointerElem.getObj().equals(prevItem)){
pointerElem = pointerElem.getNextElem();
}
newElem = new ListElement(newItem);
nextElem = pointerElem.getNextElem();
pointerElem.setNextElem(newElem);
newElem.setNextElem(nextElem);
}

public void delete(Object o){
ListElement le = startElem;
while (le.getNextElem() != null && !le.getObj().equals(o)){
if(le.getNextElem().getObj().equals(o)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}

public boolean find(Object o){
ListElement le = startElem;
while (le != null){
if(le.getObj().equals(o))
return true;
le = le.nextElem;
}
return false;
}

public ListElement getFirstElem() {
return startElem;
}

public ListElement getLastElem() {
ListElement le = startElem;
while(le.getNextElem() != null){
le = le.getNextElem();
}
return le;
}

public void writeList() {
ListElement le = startElem;
while(le != null){
System.out.println(le.getObj());
le = le.getNextElem();
}
}

public static void main(String[] args) {
EinfachVerketteteListe list = new EinfachVerketteteListe();
list.addLast("1");
list.addLast("2");
list.addLast("3");
list.addLast("4");
list.addLast("5");
list.insertAfter("2", "neu");
list.delete("3");
list.writeList();
System.out.println("erstes Element: " + list.getFirstElem().getObj());
System.out.println("ist '3' enthalten? " + list.find("3"));
System.out.println("ist '5' enthalten? " + list.find("5"));
System.out.println("letztes Element: " + list.getLastElem().getObj());
}
}

class ListElement {

Object obj;

ListElement nextElem;

public ListElement(Object obj) {
this.obj = obj;
nextElem = null;
}

public void setNextElem(ListElement nextElem) {
this.nextElem = nextElem;
}

public ListElement getNextElem() {
return nextElem;
}

public Object getObj() {
return obj;
}
}

[/Java]



[Java]

public class Win4
{
Leinwand canvas;

Win4()
{
canvas = new Leinwand("4 Gewinnt", 900, 400);
canvas.neueFlaeche("Spielfeld", 400, 200, "Mitte");
}
}
[/Java]


Den Konstruktur der Klasse Win4 müss man wenn ausführbar sein soll natürlich zu einer main methode machen
 
Was mir dazu noch seltsam auffällt das das schwarze Kästchen nur angezeigt wird wenn ich alles durchgeh (debuggen (meine Entwicklung Umgebung ist BlueJ)).
Vielleicht hat das irgendwas damit zu tun
 
Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Leinwand canvas = new Leinwand("4 Gewinnt", 900, 400);
        canvas.neueFlaeche("Spielfeld", 400, 200, "Mitte");
    }
}


class Leinwand
    extends JFrame
    implements ActionListener
{
 
    Leinwand(String Titel, int breite, int hoehe)
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle(Titel);

        setSize(breite, hoehe);

        setResizable(false);
        setVisible(true);

    }

    public void actionPerformed(ActionEvent e)
    {
        // actions have to be handled here
    }

    public void neueFlaeche(String name, int height, int width, String position)
    {
        JLabel test = new JLabel("Test nf");
        add(test, BorderLayout.LINE_END);
        validate();
        repaint();
    }

}
funktioniert bestens, alles andere mag mit Bild zusammenhängen,

funktioniert es wenn du dein Image beim Programmstart, vor setVisible(true) rechts einordnest?
verwende zum Laden lieber
> new ImageIcon(pfad).getImage()
wobei relative Pfade dann nicht so leicht sind..

im ShowCanvas musst du preferredSize setzen, sonst wird 0x0 Pixel angenommen, CENTER bekommt maximalen Platz,
was du paintest interessiert das Layout nicht, wie sollte es auch

edit: und der setSize(width, height);-Aufruf hilft gerade nicht, denn das Layout wird bei seinen Berechnungen die size setzen, ausgehend von der preferredSize 😉
ohne Layout war die size noch groß, das Bild zu sehen, aber nicht rechts,
mit Layout geht es nach rechts aber size verschwindet (testweise nach validate abfragen!),
so vom Regen in die Traufe




kannst auch ein JLabel für ein Bild nehmen, bzw. ImageIcon
 
Zuletzt bearbeitet von einem Moderator:
Also es bringt nichts wenn man setVisible später setzt.
Ich hab gedacht es ist schlauer ein Bild als BufferedImage zu speichern damit man es leichter scalieren kann oder hab ich da was missverstanden?
Reicht setSize nicht aus?
und was ist der unterschied zwischen setprefferedSize() und setSize()??
 
Jetzt liegt das Bild rechts an. Dankeschön :applaus:.
Ich hab jetzt noch kurz ne Frage die ich zwar in nem neuen Thema behandeln müsste aber vielleicht ist die ja schnell zu beantworten:
Wie man vielleicht sieht versuche ich ein 4Gewinnt zu programmieren. Wo man entscheidet wo man hinsetzt in dem mit der Tastatur die Reihe auswählt.

Nun will ich aber das ganze "komplizierte" Zeugs in eine Klassenansammlung abschieben, das man eben einfach nur wie in der 4Win Klasse einfache aufrufe hat um etwas auszuführen.
Mein Problem ist jetzt nicht die Darstellung oder Änderung, das mach ich mit verketteten Liste die die Bilderzeichnen und so weiter.

Mein eigentliches Problem ist die Übergabe der Befehle vom Keyboard in die "einfache" Klasse. Wie kann ich Keyboard Signale leicht abfangen oder kann ich das nicht. Und muss die Listener in meiner 4Win Klasse laufen lassen?
 

Zurück
Oben