所以我遇到了一个问题:我有一个小的GUI项目,我正在为了好玩而做,它在Eclipse中运行良好,没有错误,一切正常。
但是当我将它导出到一个可运行的Jar时,它将不再起作用了。基本上没有任何东西显示,甚至没有JFrame。 我尝试从其他项目制作jar并运行正常,因此我的Java(Java JRE 8v40)应该没有任何问题。
以下是您的相关代码(评论为德语,如果有不明之处,请询问):
我的主要方法
package paket;
import javax.swing.JFrame;
public class PokeMain {
static int breite = 500;
static int hoehe = 500;
static PokeGui fenster;
public static void main(String[] args) {
fenster = new PokeGui();
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setResizable(true);
fenster.setSize(breite, hoehe);
fenster.setLocationRelativeTo(null);
PokeGui.fight.requestFocus();//Fokus am Anfang
fenster.requestFocusInWindow();//Fenster soll fokussierbar sein
fenster.addKeyListener(new KeyHandler());
fenster.setVisible(true);
}
public static void getFocus() {//sorgt dafuer, dass der Fokus auch nach Buttonklicks wieder im Fenster landen kann
fenster.requestFocus();
}
}
我的整个GUI级
package paket;
import java.awt .*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing .*;
public class PokeGui extends JFrame {
static JPanel gesamtPanel, unteresPanel, aktionPanel, infoPanel, attackenPanel;//Container
static JButton fight, bag, team, run;//Aktionen waehrend eines Kampfes
static JButton attacke1, attacke2, attacke3, attacke4;
BufferedReader br;//zum Lesen/Schreiben von Dateien
static JProgressBar hpBar1, hpBar2;
static JTextArea infoAnzeige;//einziges Element im infoPanel
JLabel hp;
Font schrift;
PaintKampf pk;//Objekt der Klasse
static int hp1 = 20, hp2 = 20;//1 = Spieler, 2 = Gegner
public PokeGui() {
super("Pokemon Java");
Menueleiste ml = new Menueleiste();
setJMenuBar(ml.actual_menu_bar);
schrift = new Font("Calibri", Font.BOLD, 19);
gesamtPanel = new JPanel();
gesamtPanel.setLayout(new BorderLayout());
gesamtPanel.setFocusable(true);
gesamtPanel.setBounds(0, 0, PokeMain.breite, PokeMain.hoehe);
add(gesamtPanel);
pk = new PaintKampf();//Objekt der Klasse PaintKampf(JLabel)
pk.setBounds(0, 0, 300, 300);
gesamtPanel.add(pk);
hpBar1 = new JProgressBar(0, hp1);//Meine HP
hpBar1.setValue(hp1);
hpBar1.setFont(schrift);
hpBar1.setString("HP: " + hp1);
hpBar1.setStringPainted(true);
hpBar1.setForeground(Color.GREEN);
hpBar1.setBackground(Color.WHITE);
// gesamtPanel.add(hpBar1,BorderLayout.NORTH);
hpBar2 = new JProgressBar(0, hp2);//Gegner HP
hpBar2.setValue(hp2);
hpBar2.setString("HP: " + hp2);
hpBar2.setStringPainted(true);
hpBar2.setForeground(Color.GREEN);
hpBar2.setBackground(Color.WHITE);
// gesamtPanel.add(hpBar2,BorderLayout.EAST);
unteresPanel = new JPanel();//enthaelt Aktionen wahrend eines Kampfes sowie Textanzeige waehrenddessen
unteresPanel.setLayout(new GridLayout(1, 0));
gesamtPanel.add(unteresPanel, BorderLayout.SOUTH);
infoAnzeige = new JTextArea("What should your POKéMON\ndo?");
infoAnzeige.setLineWrap(false);
infoAnzeige.setOpaque(false);//durchsichtig
infoAnzeige.setEditable(false);
infoAnzeige.setFocusable(false);
infoAnzeige.setForeground(new Color(30, 60, 240));
infoAnzeige.setFont(schrift);
infoPanel = new JPanel();//ganz unten links
infoPanel.add(infoAnzeige);//fuegt das JTextArea zum Panel hinzu
infoPanel.setBackground(new Color(240, 255, 255));
unteresPanel.add(infoPanel);
aktionPanel = new JPanel();//ganz unten rechts
aktionPanel.setLayout(new GridLayout(2, 0));
aktionPanel.setFocusable(true);
unteresPanel.add(aktionPanel);//fuegt es dem "uebergeordneten" Panel hinzu
aktionPanel.addKeyListener(new KeyHandler());
attackenPanel = new JPanel();//ganz unten rechts
attackenPanel.setLayout(new GridLayout(2, 2));
attackenPanel.setVisible(false);
//Initialisierung der Buttons sowie Auslesen der Attackennamen
try {
br = new BufferedReader(new FileReader("src/Player_Attacken.txt"));
attacke1 = new JButton(br.readLine());//liest aus der Datei die jeweilige Zeile aus und geht dann zur naechsten Zeile
attacke2 = new JButton(br.readLine());
attacke3 = new JButton(br.readLine());
attacke4 = new JButton(br.readLine());
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException io) {
}
attacke1.setContentAreaFilled(false);//macht alles ausser dem Inhalt unsichtbar
attacke1.setFont(schrift);
attackenPanel.add(attacke1);
attacke1.addKeyListener(new KeyHandler());
attacke1.addActionListener(new ActionHandler_Kampf());
attacke2.setContentAreaFilled(false);//macht alles ausser dem Inhalt unsichtbar
attacke2.setFont(schrift);
attackenPanel.add(attacke2);
attacke2.addKeyListener(new KeyHandler());
attacke2.addActionListener(new ActionHandler_Kampf());
attacke3.setContentAreaFilled(false);//macht alles ausser dem Inhalt unsichtbar
attacke3.setFont(schrift);
attackenPanel.add(attacke3);
attacke3.addKeyListener(new KeyHandler());
attacke3.addActionListener(new ActionHandler_Kampf());
attacke4.setContentAreaFilled(false);//macht alles ausser dem Inhalt unsichtbar
attacke4.setFont(schrift);
attackenPanel.add(attacke4);
attacke4.addKeyListener(new KeyHandler());
attacke4.addActionListener(new ActionHandler_Kampf());
fight = new JButton("FIGHT");
fight.setBorderPainted(false);//macht die Raender unsichtbar
// fight.setContentAreaFilled(false);//macht alles ausser dem Inhalt unsichtbar
fight.setBackground(Color.RED);
fight.setFont(schrift);
aktionPanel.add(fight);
fight.addKeyListener(new KeyHandler());
fight.addActionListener(new ActionHandler_Kampf());
bag = new JButton("BAG");
bag.setFont(schrift);
bag.setBorderPainted(false);
bag.setBackground(new Color(218, 165, 32));
aktionPanel.add(bag);
bag.addKeyListener(new KeyHandler());
bag.addActionListener(new ActionHandler_Kampf());
team = new JButton("POKéMON");
team.setFont(schrift);
team.setBorderPainted(false);
team.setBackground(new Color(50, 205, 50));
aktionPanel.add(team);
team.addKeyListener(new KeyHandler());
team.addActionListener(new ActionHandler_Kampf());
run = new JButton("RUN");
run.setFont(schrift);
run.setBorderPainted(false);
run.setBackground(new Color(30, 144, 255));
aktionPanel.add(run);
run.addKeyListener(new KeyHandler());
run.addActionListener(new ActionHandler_Kampf());
// gesamtPanel.setVisible(false);
}
}
这是我的paintComponent-Method,我绘制图像。
package paket;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
public class PaintKampf extends JLabel {
Image kampf_hintergrund, P1, P2;//Hintergrund
URL link, linkP1, linkP2;//URL des Bildes
@Override
public void paintComponent(Graphics g) {//paint-Methode
super.paintComponent(g);
try {
link = new URL("http://i.imgur.com/pwkzzgv.png");
}//holt sich das Bild von diesem Link
catch (MalformedURLException e) {
e.printStackTrace();
}
try {
kampf_hintergrund = ImageIO.read(link);
}//setzt das Bild gleich der URL
catch (IOException e) {
e.printStackTrace();
}
try {
linkP1 = new URL("http://i.imgur.com/dg5xRUy.png");
}//holt sich das Bild von diesem Link
catch (MalformedURLException e) {
e.printStackTrace();
}
try {
P1 = ImageIO.read(linkP1);
}//Spieler 1
catch (IOException e) {
e.printStackTrace();
}
try {
linkP2 = new URL("http://i.imgur.com/fdZyPbr.png");
}//holt sich das Bild von diesem Link
catch (MalformedURLException e) {
e.printStackTrace();
}
try {
P2 = ImageIO.read(linkP2);
}//Spieler 2
catch (IOException e) {
e.printStackTrace();
}
g.drawImage(kampf_hintergrund, 0, 0, null);//zeichnet das Hintergrundbild
g.drawImage(P1, 0, 200, null);
g.drawImage(P2, 350, 90, null);
}
}
我还不能发布任何图片,但正如我所说,在Eclipse中,程序本身似乎没有任何问题。