import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class zaratma {
static JFrame win = new JFrame("Zar Atma Uygulaması");
static JButton dice = new JButton("Zar At");
public static void dice() {
Random ran = new Random();
int dice1 = ran.nextInt(6)+1;
int dice2 = ran.nextInt(6)+1;
JLabel dicee1 = new JLabel(new ImageIcon("C:\\Users\\talha\\Desktop\\dices\\"+dice1+".png"));
JLabel dicee2 = new JLabel(new ImageIcon("C:\\Users\\talha\\Desktop\\dices\\"+dice2+".png"));
dicee1.setBounds(185, 100, 100, 100);
dicee2.setBounds(295, 100, 100, 100);
System.out.println(dice1);
System.out.println(dice2);
switch(dice1){
case 1:
win.add(dicee1);
break;
case 2:
win.add(dicee1);
break;
case 3:
win.add(dicee1);
break;
case 4:
win.add(dicee1);
break;
case 5:
win.add(dicee1);
break;
case 6:
win.add(dicee1);
break;
}
switch(dice2){
case 1:
win.add(dicee2);
break;
case 2:
win.add(dicee2);
break;
case 3:
break;
case 4:
win.add(dicee2);
break;
case 5:
win.add(dicee2);
break;
case 6:
win.add(dicee2);
break;
}
}
public static void main(String[]args) {
win.setSize(600,400);
win.getContentPane().setBackground(new Color(36, 5, 2));
win.setLayout(null);
dice.setBounds(240, 325, 100, 30);
dice.setBackground(new Color(10, 3, 2));
dice.setForeground(Color.LIGHT_GRAY);
dice.setBorderPainted(false);
dice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dice();
}
});
win.add(dice);
win.setVisible(true);
}
}
Merhabalar zar atan bir uygulama yaptım. Bazı sorunlar var elbet
Sorunlar:
Resimleri dosyadan gayet güzel çekiyor fakat programda resim gözükmüyor. Eğer programı boyutunu değiştirirseniz(kod ile değil) resimler gözükmeye başlıyor.
İkincisi zarat fonksiyonu ikinci kez tuşa bastığımda çalışmıyor.
Pencerenin kapatma tuşuna basınca pencere kapanıyor ama program arkaplanda çalışmaya devam ediyor. Programın komple kapanabilmesi için her programda şunu eklemeniz gerekiyor. pencere.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
switch-case ifadesi gereksiz olmuş. Onları hiç yazmasanız da olur.
Resimlerin ekranda görüntülenmemesinin sebebi pencerenin hemen yenilenmemesidir. Yani ekleme işlemini yaptıktan sonra, arayüzü yenilemelisiniz. Bir kaç yolu var. İncelemek için şuraya bakın SwingUtilities.updateComponentTreeUI(win);
Butonun ikinci kez çalışmama durumu yok. Sadece her butona bastığınızda yeniden iki JLabel oluşturuyorsunuz ve pencereye önceden eklenmiş iki JLabel nesnesinin olduğu yere yerleştiriyorsunuz. Yani her seferinde ekrandaki JLabel sayısı artıyor gereksiz yere. Önlemenin iki yolu var. Ya önceki durumda eklediğiniz JLabel nesnelerinin resmini güncelleyeceksiniz ya da onları kaldırıp tekrar JLabel nesnesi ekleyeceksiniz.
Programınızı Nesne Yönelimli Programlamaya uygun yazarsanız yönetimi kolay olur. Ben sizin için programı tekrar düzenliyorum, inceleyebilirsiniz.
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class ZarAtma {
Random ran = new Random();
JFrame win;
JButton zarButon;
JLabel dicee1;
JLabel dicee2;
public ZarAtma() {
// Pencere ayarları
this.win = new JFrame("Zar Atma Uygulaması");
win.setSize(600, 400);
win.getContentPane().setBackground(new Color(36, 5, 2));
win.setLayout(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Buton ayarları
this.zarButon = new JButton("Zar At");
zarButon.setBounds(240, 325, 100, 30);
zarButon.setBackground(new Color(10, 3, 2));
zarButon.setForeground(Color.LIGHT_GRAY);
zarButon.setBorderPainted(false);
zarButon.addActionListener((ActionEvent e) -> {
zarAt();
});
// Resim nesneleri
this.dicee1 = new JLabel();
this.dicee2 = new JLabel();
dicee1.setBounds(185, 100, 100, 100);
dicee2.setBounds(295, 100, 100, 100);
win.add(dicee1);
win.add(dicee2);
win.add(zarButon);
win.setVisible(true);
}
public void zarAt() {
int dice1 = ran.nextInt(6) + 1;
int dice2 = ran.nextInt(6) + 1;
System.out.println(dice1 + " " + dice2);
dicee1.setIcon(new ImageIcon("/home/coderistan/dices/" + dice1 + ".png"));
dicee2.setIcon(new ImageIcon("/home/coderistan/dices/" + dice2 + ".png"));
SwingUtilities.updateComponentTreeUI(win);
}
public static void main(String[] args) {
// Program başlangıç noktası
new ZarAtma();
}
}
Zar resimlerinden olan 1.png dosyasının boyutu büyük, o yüzden onun boyutunu 100x100 olarak ayarlarsanız herşey tamamdır.
SO’daki soruya baktim. Kodda Swing’in ilk prensiplerine bile baglilik olmadigi, bir suru yaklasim hatasi oldugu icin Swing tutorial’ini bitirip bu yola tekrar koyulmani tavsiye etmisler. Buna ragmen spesifik hatalari ve nasil cozuleceklerini de yazmislar. (Ama @coderistan’in yaptigi gibi cozulmus hazir kodu vermemisler. {Buraya balik hikayesini yazarken bizzat kendisinin refere ettigini gordum. <3}) Burada bir sorun goremedim.
Bu arada MediaFire toplu dosya indirmeye izin vermiyor. Insanlarin asset’leri tek bir klikle indirebilecegi bir cozum bulursan (ziplemek gibi) ve kodu degistirmeden kullanmalarini saglayabilirsen daha cok kisi yardim eder.
Yani Stack Overflow’da sorduğun soruya gelen cevaplar gayet yerinde, doğru önerilerde bulunmuşlar. Benim gibi hazır kodu önüne koymamaları daha iyi Bunda bir sorun yok demek istemiş. Ayrıca paylaştığın dosyalar tek bir dosya halinde(zip vs) olursa insanlar daha rahat erişip yardımcı olabilir.