Hallo,
zunächst einmal sind das meine Klassen
Ich würde die Klassenunterteilung gerne beibehalten. Mein Problem ist, dass sobald ich auf die jeweiligen Buttons klicke, mir der Text "oben" "unten" etc. zwar korrekt ausgegeben wird, der Button also somit erkannt wird, jedoch verschiebt sich das Bild nicht. Die repaint-Methode habe ich im Nachhinein noch implementiert. Ob sie jetzt da ist oder nicht hat keinen Unterschied gemacht, ich habe sie jedoch dringelassen damit ihr seht, was ich bereits ausprobiert habe.
Viele Grüße
zunächst einmal sind das meine Klassen
Java:
import javax.swing.JFrame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyFrame extends JFrame implements ActionListener {
UpperPanel uPanel;
LowerPanel lPanel;
SidePanel sPanel;
public MyFrame(){
setTitle("Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(630, 650);
setResizable(true);
setLocationRelativeTo(null);
// neues Layout Manager Objekt und constraints Objekt erstellen, Layout dem Frame hinzufügen
GridBagLayout layout = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
setLayout(layout);
// neue Panelobjekte erstellen
uPanel = new UpperPanel();
lPanel = new LowerPanel();
sPanel = new SidePanel();
uPanel.getButtonLeft().addActionListener(this);
uPanel.getButtonRight().addActionListener(this);
sPanel.getButtonUp().addActionListener(this);
sPanel.getButtonDown().addActionListener(this);
// Add UpperPanel to the layout
constraints.gridx = 0; // fängt oben links an mit diesen Einstellungen
constraints.gridy = 0;
constraints.gridwidth = 2; // gridwith von diesem und SidePanel addiert sich insgesamt zu 3
constraints.gridheight = 1; // da gridheight von SidePanel 2 ist weiß Programm das Upper und Lower Panel 2 unterschiedliche Grids auf der 2/3 Seite sind
constraints.weightx = 0.67; // nimmt 2/3 horizontal des Objekts (hier frame-Objekt) ein auf dem es platziert ist
constraints.weighty = 0.1; // nimmt 1/10 vertikal des Objekts ein auf dem es paltziert ist
constraints.fill = GridBagConstraints.BOTH;
layout.setConstraints(uPanel, constraints);
add(uPanel);
// Add LowerPanel to the layout
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 0.67;
constraints.weighty = 0.9;
constraints.fill = GridBagConstraints.BOTH;
layout.setConstraints(lPanel, constraints);
add(lPanel);
// Add SidePanel to the layout
constraints.gridx = 2;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 2;
constraints.weightx = 0.33;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.BOTH;
layout.setConstraints(sPanel, constraints);
add(sPanel);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == uPanel.getButtonLeft()){
int currentX = lPanel.getImageLabel().getX();
lPanel.getImageLabel().setLocation(currentX - 10, lPanel.getImageLabel().getY());
}
else if (e.getSource() == uPanel.getButtonRight()){
int currentX = lPanel.getImageLabel().getX();
lPanel.getImageLabel().setLocation(currentX + 10, lPanel.getImageLabel().getY());
System.out.println("Rechts");
}
else if (e.getSource() == sPanel.getButtonUp()){
int currentY = lPanel.getImageLabel().getY();
lPanel.getImageLabel().setLocation(lPanel.getImageLabel().getX(), currentY + 10);
System.out.println("Oben");
}
else if (e.getSource() == sPanel.getButtonDown()){
int currentY = lPanel.getImageLabel().getY();
lPanel.getImageLabel().setLocation(lPanel.getImageLabel().getX(), currentY - 10);
System.out.println("Unten");
}
lPanel.repaint();
lPanel.revalidate();
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class LowerPanel extends JPanel {
JLabel imageLabel;
public LowerPanel(){
setBackground(Color.BLUE);
ImageIcon originalIcon = new ImageIcon("IMG-20220508-WA0017.jpg"); // zuerst Bild in ImageIcon-Objekt einfügen
Image image = originalIcon.getImage().getScaledInstance(150, 150, Image.SCALE_SMOOTH);
ImageIcon scaledIcon = new ImageIcon(image); // ImageObjekt zurück in ein ImageIcon-Objekt umwandeln damit es von JLabel Objekt getragen werden kann
imageLabel = new JLabel(scaledIcon);
add(imageLabel);
}
// override-methode wird automatisch von jedem Objekt dieser Klasse ausgeführt ohne konkrete Implementierung
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // einige grundlegende Zeichnungsoperationen ausgeführt, die erforderlich sind, um das Komponenten-Rendering korrekt durchzuführen.
// Positionieren des JLabels in der Mitte des Panels
int x = (getWidth() - imageLabel.getPreferredSize().width) / 2; // (LowerPanel-Objekt-imageLabel-Obekt) / 2
int y = (getHeight() - imageLabel.getPreferredSize().height) / 2;
imageLabel.setLocation(x, y);
}
public JLabel getImageLabel(){
return imageLabel;
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JPanel;
public class SidePanel extends JPanel {
JButton buttonUp;
JButton buttonDown;
public SidePanel(){
setBackground(Color.GREEN);
setLayout(new BorderLayout()); // JButton Komponente wird kein Standard LM zugewiesen, sodas wir BLM erstellen und zuweisen müssen
buttonUp = new JButton();
buttonDown = new JButton();
buttonUp.setText("oben");
buttonDown.setText("unten");
add(buttonUp, BorderLayout.NORTH);
add(buttonDown, BorderLayout.SOUTH);
}
public JButton getButtonUp(){
return buttonUp;
}
public JButton getButtonDown(){
return buttonDown;
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JPanel;
public class UpperPanel extends JPanel {
JButton buttonLeft;
JButton buttonRight;
public UpperPanel (){
setBackground(Color.RED);
setLayout(new BorderLayout()); // JButton Komponente wird kein Standard LM zugewiesen, sodas wir BLM erstellen und zuweisen müssen
buttonLeft = new JButton();
buttonRight = new JButton();
buttonLeft.setText("links");
buttonRight.setText("rechts");
add(buttonRight, BorderLayout.EAST);
add(buttonLeft, BorderLayout.WEST);
}
public JButton getButtonLeft(){
return buttonLeft;
}
public JButton getButtonRight(){
return buttonRight;
}
}
Ich würde die Klassenunterteilung gerne beibehalten. Mein Problem ist, dass sobald ich auf die jeweiligen Buttons klicke, mir der Text "oben" "unten" etc. zwar korrekt ausgegeben wird, der Button also somit erkannt wird, jedoch verschiebt sich das Bild nicht. Die repaint-Methode habe ich im Nachhinein noch implementiert. Ob sie jetzt da ist oder nicht hat keinen Unterschied gemacht, ich habe sie jedoch dringelassen damit ihr seht, was ich bereits ausprobiert habe.
Viele Grüße