So ändern Sie Bild in JPanel, ohne einen neuen JFrame (Repaint() funktioniert nicht! )
Menschen des Internets!
Ich ve wurden arbeiten an ein Trink-Spiel-Programm für die Schule.
//nicht relevante Informationen, nur für die lulz:
//Die Schule vorgeschlagen, das Spiel habe ich nicht 😉 das ist das Spiel //http://sotallytober.com/games/verbal/mexican/
Sowieso, ich Malte ein Bild in ein JPanel mit dem folgenden code (es ist eine Klasse, die Sie erweitert JPanel)
public class iconPanel extends JPanel {
ImageIcon image;
Image pic;
public iconPanel(String startScreenImage) {
image = new ImageIcon(startScreenImage);
pic = image.getImage();
this.setBackground(new Color(0, true));
}
@Override
public void paintComponent(Graphics g) {
//Paint background first
g.drawImage (pic, 0, 0, getWidth (), getHeight (), this);
}
Nun in meiner anderen Klasse, wo ich das layout und die Komponenten erkläre ich auf der Oberseite meines JPanels wie diese :
private JPanel pnDrinkPlayerBW;
Dann in einer Methode der gleichen Klasse mit dem Namen MakeComponents ich die JPanel zu :
pnDrinkPlayerBW = new iconPanel("img/glass.jpg");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));
Danach füge ich dem Panel, wo es kommen muss, und das panel auf das frame in der Methode makeLayout() (ich denke nicht, dass es sinnvoll code, so dass, wenn Sie es sehen wollen, Fragen Sie mich)
Dann auf, wenn eine Taste gedrückt wird, will ich das ändern glass.jpg Bild zu einem anderen Bild, zum Beispiel beerGlass0.png, so in den actionlistener in eine andere Methode actionEvents() ich Mach das:
pnDrinkPlayerBW = new iconPanel("img/beerGlass.png");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));
pnDrinkPlayerBW.repaint();
Ich lege den Konstruktor dieser Klasse auch hier, nur wenn die Menschen es brauchen :
public SpelScreen(){
makeComponents();
makeLayout();
actionEvents();
} //note : this is'nt the full constructor, just the call for the methods I talked about, SpelScreen extends JFrame..
Also, was ich tun möchte, wird in der Klasse SpelScreen ein neues Bild für die iconPanel und streichen Sie es mit der gleichen Instanz der spelscreen.
Ich bin Recht neu in Java, also nicht erwarten, dass Sie mich zu schnell komplizierte code 🙂
Dank!
- Du hast vergessen zu nennen
super.paintComponent
in IhrempaintComponent
Methode. - Meinst du wie diese? public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage (pic, 0, 0, getWidth (), getHeight (), this);
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off, du bist vergessen zu nennen
super.paintComponent
in IhrempaintComponent
Methode. AuchpaintComponent
sollteprotected
nichtpublic
Zweiten, ich glaube nicht, dass Sie möchten, erstellen Sie eine neue
iconPanel
und rufen Sie sofort repaint auf. Das wird sich wahrscheinlich nichts tun.Stattdessen eine
setter
für Ihrepic
, dann nurrepaint();
innen diese Methode.Dann können Sie einfach anrufen, die
setPic
von der Klasse, die Sie erstellt dieiconPanel
im. Zum BeispielAndere option ist, nur um ein array von Bildern, die Sie initialisieren
iconPanel
. Dann in eine Zuhörerin zu werden, können Sie nur ändern, den index wenn die Bild-array rufen dann repaint. So etwasDann könnte man nur ändern, die
imageIndex
undrepaint()
Seite Hinweis
Sollten Sie mit Hilfe der Java-Namenskonvention. Klassennamen mit Großbuchstaben d.h.
iconPanel
→IconPanel
Update
Mit
ImageIcon
setImage
Methode sollte einenImageIcon
statt einerImage
als argument, und dann brauchen Sie, um diepic =
Bild.Funktion "getImage ()" in der Methode. Tun Sie es bekommen?JPanel panel = new iconPanel
. Es mussiconPanel panel = new iconPanel
. Wenn Sie das erste, Sie beschränkt sich auf die Methode derJPanel
und nichticonPanel
g.setColor(Color.GRAY); g.fillRect(0, 0, getWidth(), getHeight());
bevor Sie zu zeichnen Ihr Bild. Auch Siemust
nennensuper.paintComponent
wenn Sie schon nicht haben.super.paintComponent
. Hast du das gemacht? Wenn Sie nicht es wird dazu führen, Dinge wie in deinem verlinkten Bild, die als Farb-Artefakte.