Hej, dwa pytania odnośnie Javy. Napisałem prosty program symulujący rzut kością prezentującym wyniki rzutu na ekranie w formie graficznej. Klasa Panel1 extends JPanel oraz klasa GraWKosci tworzące ramke, dodajace do niej komponenty, z możliwością wyboru iloma kostkami chcemy rzucać.
Po wielu próbach działa, ale po zmianie ilości kostek aplikacja nie odświeża się automatycznie, muszę kliknąć drugi raz na pole wyboru lub np. rozszerzyć okno aby program wygenerował nową ilość kostek (bez tego ramka pozostaje pusta), wiec pierwsze pytanie dotyczy tego, jak mogę to rozwiązać, ewentualnie dlaczego nie mogę? :)
Druga sprawa dotyczy skompilowania tego do pliku jar, po wygenerowaniu przez kompilator plikow class i próbie dodania ich do archiwum JAR komenda " -jar cvmf manifest.txt aplk.jar GraWKosci.class " kompilator wyświetla added manifest
adding: GraWKosci.class(in = 3309) (out= 1825)(deflated 44%), a sam plik nie uruchamia aplikacji.
Z góry dziękuję, za odpowiedź, poniżej wklejam kody napisanych klas:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class GraWKosci {
JFrame ramka;
JPanel panelGlowny;
JPanel wyniki;
JTextField wynik;
JTextField wynik2;
JTextField wynik3;
ArrayList<Panel1> lista = new ArrayList<Panel1>();
ArrayList<JTextField> wynikLista = new ArrayList<JTextField>();
public static void main(String[] args) {
new GraWKosci().tworzGUI();
}
public void tworzGUI() {
ramka = new JFrame("Gra w kości");
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] obiekty = new String[3];
for (int i = 0; i < 3; i++) {
obiekty[i] = ("Rzuć " + (i + 1) + " kośćmi");
}
JPanel panelWyb = new JPanel(new FlowLayout());
JComboBox wybor = new JComboBox(obiekty);
panelWyb.add(new Label("Ile kości"));
panelWyb.add(wybor);
wybor.addActionListener(new Lista());
ramka.getContentPane().add(BorderLayout.NORTH, panelWyb);
ramka.setSize(450, 200);
ramka.setVisible(true);
JPanel dol = new JPanel();
BorderLayout layout = new BorderLayout();
dol.setLayout(layout);
JButton przycisk = new JButton("Losuj");
dol.add(BorderLayout.SOUTH, przycisk);
wyniki = new JPanel();
wyniki.setLayout(new BoxLayout(wyniki, BoxLayout.X_AXIS));
wyniki.add(new Label("Poprzednie rzuty:"));
wynik = new JTextField();
wynikLista.add(wynik);
wyniki.add(wynik);
wynik.setEditable(false);
wynik2 = new JTextField();
wynikLista.add(wynik2);
wyniki.add(wynik2);
wynik2.setEditable(false);
wynik3 = new JTextField();
wynikLista.add(wynik3);
wyniki.add(wynik3);
wynik3.setEditable(false);
wyniki.add(wynik);
wyniki.add(wynik2);
wyniki.add(wynik3);
ramka.getContentPane().add(BorderLayout.SOUTH, dol);
dol.add(BorderLayout.NORTH, wyniki);
przycisk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ramka.repaint();
int ile = lista.size();
if (ile >= 1) {
int tekst1 = lista.get(0).ile();
wynik.setText(" " + tekst1);
}
if (ile >= 2) {
int tekst2 = lista.get(1).ile();
wynik2.setText(" " + tekst2);
}
if (ile >= 3) {
int tekst3 = lista.get(2).ile();
wynik3.setText(" " + tekst3);
}
}
});
panelGlowny = new JPanel();
ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);
}
public void tworzGUI4(int ilosc) {
panelGlowny = new JPanel();
panelGlowny.setLayout(new BoxLayout(panelGlowny, BoxLayout.X_AXIS));
for (int i = 0; i <= ilosc && i < 3; i++) {
Panel1 panel = new Panel1();
lista.add(panel);
panelGlowny.add(panel);
}
ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);
}
public class Lista implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
ramka.remove(panelGlowny);
lista.removeAll(lista);
wynikLista.removeAll(wynikLista);
JComboBox cb = (JComboBox) e.getSource();
int ilosc = cb.getSelectedIndex();
tworzGUI4(ilosc);
ramka.repaint();
wynik.setText(null);
wynik2.setText(null);
wynik3.setText(null);
}
}
}
import javax.swing.*;
import java.awt.*;
public class Panel1 extends JPanel {
int losowy2;
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.fillRect(10, 10, 50, 50);
int losowy = (int) (Math.random() * 6 + 1);
losowy2 = losowy;
g2d.setColor(Color.BLUE);
int x = 10;
int y = 10;
for (int i = 0; (i<losowy) & (i<3); i++) {
g2d.fillOval(x, y, 10, 10);
x += 20;
}
if (losowy > 3) {
x = 10;
y += 30;
for (int i = 0; i < losowy - 3; i++) {
g2d.fillOval(x, y, 10, 10);
x += 20;
}
}
}
public int ile(){
return losowy2;
}
}