Я недавно экспериментировал со Swing (новичок) и, пытаясь сделать одно приложение для друга, столкнулся с проблемой. Я использую IDEA IDE, и макет, и все кадры отображаются правильно, но когда я экспортирую проект с помощью maven, файл jar показывает макет с отсутствующими панелями и кнопками.
Мой исходный код для кадра: ( Примечание. Я удалил все другие методы, поскольку они не изменяли макет (только геттеры и сеттеры для других объектов, а также удалил actionCalls и другой подобный код для кнопок.)
public class OOBFrame extends JFrame {
private final Container c = getContentPane();
private final DefaultListModel<Craft> textForWhite = new DefaultListModel<>();
private final DefaultListModel<Craft> textForBlack = new DefaultListModel<>();
private final JCraftList<Craft> whiteListedCrafts = new JCraftList<>(textForWhite);
private final JCraftList<Craft> blackListedCrafts = new JCraftList<>(textForBlack);
private final JScrollPane scrollerWhite = new JScrollPane(whiteListedCrafts);
private final JScrollPane scrollerBlack = new JScrollPane(blackListedCrafts);
private final SortedMap<Craft, ArrayList<JButton>> templateButtons = new TreeMap<>();
private final JButton nextScreen = new JButton("Finish");
private final JButton editing = new JButton("Edit selected");
private final ArrayList<Craft> selectedCraftsFromList = new ArrayList<>();
private JCraftPanel details;
private final GridBagConstraints gcDetails;
private JList<Craft> lastSelectedList;
public OOBFrame(String title) {
super(title);
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
c.setBackground(Gui.BACKGROUND);
c.setLayout(new GridBagLayout());
c.setPreferredSize(Gui.getMonitorSize());
gc.gridx = 0;
gc.gridy = 0;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.anchor = GridBagConstraints.NORTH;
gc.gridwidth = 6;
getContentPane().add(new JMenuExt(1), gc);
whiteListedCrafts.setBackground(Gui.BACKGROUND);
whiteListedCrafts.setForeground(Color.WHITE);
blackListedCrafts.setBackground(Gui.BACKGROUND);
blackListedCrafts.setForeground(Color.WHITE);
gc = new GridBagConstraints();
gc.gridheight = OOB.TEMPLATE.getCrafts().size();
gc.fill = GridBagConstraints.BOTH;
gc.weighty = 4;
gc.weightx = 1;
gc.gridx = 0;
gc.gridy = 1;
getContentPane().add(scrollerWhite, gc);
gc.gridx = 4;
gc.gridwidth = 2;
getContentPane().add(scrollerBlack, gc);
gc.fill = GridBagConstraints.HORIZONTAL;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.gridy = 0;
gc.gridx = 1;
gc.weightx = 0.1;
for (Craft craft : OOB.TEMPLATE.getCrafts()) {
++gc.gridy;
templateButtons.put(craft, new ArrayList<>());
templateButtons.get(craft).add(new JButton("+"));
templateButtons.get(craft).add(new JButton("+"));
c.add(templateButtons.get(craft).get(0), gc);
++gc.gridx;
gc.weightx = 8;
JLabel newLabel = new JLabel(craft.getName());
newLabel.setForeground(Gui.FOREGROUND);
newLabel.setHorizontalAlignment(SwingConstants.CENTER);
newLabel.setPreferredSize(new Dimension(200, 20));
c.add(newLabel, gc);
gc.weightx = 0.1;
++gc.gridx;
c.add(templateButtons.get(craft).get(1), gc);
gc.gridx -= 2;
templateButtons.get(craft).get(0).addActionListener(e -> {
Craft newCraft = craft.copy(Side.WHITE);
OOB.WHITE.addCraft(newCraft);
textForWhite.addElement(newCraft);
whiteListedCrafts.updateUI();
});
templateButtons.get(craft).get(1).addActionListener(e -> {
Craft newCraft = craft.copy(Side.BLACK);
OOB.BLACK.addCraft(newCraft);
textForBlack.addElement(newCraft);
blackListedCrafts.updateUI();
});
}
gc.anchor = GridBagConstraints.SOUTH;
++gc.gridy;
++gc.gridy;
gc.gridx = 5;
gc.fill = GridBagConstraints.BOTH;
//nextScreen.setPreferredSize(new Dimension(200, 100));
getContentPane().add(nextScreen, gc);
details = new JCraftPanel(" ", selectedCraftsFromList, false);
gcDetails = new GridBagConstraints();
gcDetails.gridx = 0;
gcDetails.gridy = gc.gridy;
gcDetails.gridwidth = 4;
gcDetails.gridheight = 2;
gcDetails.weighty = 2;
gcDetails.fill = GridBagConstraints.BOTH;
add(details, gcDetails);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
validate();
pack();
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(false);
}
}
Спасибо за понимание того, что я мог сделать неправильно. Frame также имеет значение setVisible (true) в предыдущем кадре приложения, так что это не проблема. Я могу предоставить любой код других ярлыков и панелей, если необходимо, или всего проекта.
Отредактировано:
Console run of the jar.
D:\GitProjects\KSP-NoU-Battle System 3\target>java -cp Battle_Simulator_3.0-1.0.0.0.jar impl.App
java.nio.file.NoSuchFileException: database.csv
[ERR 17:02:24] java.nio.file.NoSuchFileException: countermeasures.txt
[ERR 17:02:24] java.nio.file.NoSuchFileException: weapons.txt
[LOG 17:02:24] Crafts saved: [0]
Затем журнал заканчивается, но запускается первое окно приложения. За ним следует неправильное окно.
Решено: в приложении отсутствовали файлы ресурсов, в результате чего панели не загружались.