GUI šachovnice – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

GUI šachovnice – Java – Fórum – Programujte.comGUI šachovnice – Java – Fórum – Programujte.com

 

JanH
~ Anonymní uživatel
10 příspěvků
23. 4. 2013   #1
-
0
-

Dobrý den,

prosím vás, jaký by byl nejjednodušší způsob vykreslení funkční šachovnice pomocí AWT nebo Swing v Jave?

Uvažoval jsem o tom, že bych šachovnici poskládal z "tlačítek", ale nezdá se mi to jako nejlepší způsob.

Neexistuje nějaký lepší způsob?

Hru už naimplementovanou mám, jen bych rád dodělal GUI.

Předem díky za rady.

Nahlásit jako SPAM
IP: 83.240.81.–
Flowy0
Věrný člen
24. 4. 2013   #2
-
0
-

ak to potrebujes mat interaktivne tak jedine tlacitka ... inak mozes pouzit obrazky pripadne textove rozhranie ale to nebude vyzerat moc dobre

Nahlásit jako SPAM
IP: 85.237.224.–
https://github.com/Flowy
JanH
~ Anonymní uživatel
10 příspěvků
24. 4. 2013   #3
-
0
-

#2 Flowy
Ano chtěl bych to interaktivni.

Ještě bych se rád zeptal, jak můžu tlačítko zobrazit jako obrázek. (např. černý čtvereček).

Děkuji

Nahlásit jako SPAM
IP: 83.240.81.–
sleepy0
Stálý člen
24. 4. 2013   #4
-
0
-

Aj obrazok v JPanely mozes mat interakivny. Staci si odchytit MouseListener -> mouseClicked(MouseEvent e){e.getX(); e.getY()}. A uz len spocitas kde bolo kliknute. Ten obrazok mozes generovat, tak ze vykreslis Rectangle na kazdu poziciu a len striedas farby napriklad (i+j)%2->{1,0}, kde i je riadok a j je stlpec, malo by to pekne prstriedat. Obrazok budes menit, ked resiznes, minimalizujes atd.... . A navyse vies do teoho kreslit priamo figurky, nemusis volat tlacitko na ktore sa ma premiestnit. A casom mozno budes vediet spravit aj animaciu, co je s tlacitkami nemozne.

Nahlásit jako SPAM
IP: 158.195.204.–
Petr
~ Anonymní uživatel
746 příspěvků
24. 4. 2013   #5
-
0
-

#4 sleepy
Dekuju za radu, nejspíš to tak udělám.

Ale přece by mě zajímalo jak na tlačítko dát obrázek.

Nahlásit jako SPAM
IP: 89.190.62.–
sleepy0
Stálý člen
24. 4. 2013   #6
-
0
-
Nahlásit jako SPAM
IP: 158.195.204.–
JanH
~ Anonymní uživatel
10 příspěvků
25. 4. 2013   #7
-
0
-

#6 sleepy
Prosím vás.

Vytvoril jsem si okno o velikosti setSize(600, 600) a vkladam do nej JPanel o velikosti setSize(500, 500), ale kdyz program spustim, tak okno ma pozadovanou velikost, ale ten JPanel ma minimalni velikost, skoro neni videt.

Proc nema vlozeny JPanel nastavenou velikost setSize(500, 500)?

Predem dekuji za pomoc!

public class Okno extends JFrame {

  protected JPanel sachovnice;
  protected JButton tlacitko;

  public Okno() {
    super.setTitle("Dama");
    this.setLayout(new FlowLayout());

    sachovnice = new JPanel();
    sachovnice.setLayout(new GridLayout(1, 1));
    sachovnice.setSize(500, 500);

    tlacitko = new JButton();

    sachovnice.add(tlacitko);
    this.add(sachovnice);

    this.setSize(600, 600);
}     
Nahlásit jako SPAM
IP: 89.190.62.–
sleepy0
Stálý člen
26. 4. 2013   #8
-
0
-

Tieto Layouty si pocitaju velkost ktoru budu jednotlive komponenty zaberat same. Cize navrhol by som kompromis, nepouzit ani jeden z vyssie spomenutych, ale pouzit GridBagLayout, ktory je o nieco viac konfigurovatelny.

JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(30,30,30,30) // Nastavi v pixeloch odsadenie od ineho komponentu
gbc.fill = GridBagConstaints.BOTH; // Vyplni priestor horizontalne aj vertikalne
gbc.weightx=1.;
gbc.weighty=1.;
//Tieto dve su defaultne 0 to je poloha v mriezke ak tam bude viac komponentou
gbc.gridx=0; 
gbc.gridy=0;
frame.add(panel, gbc);
frame.setVisible(true);
Nahlásit jako SPAM
IP: 158.195.204.–
MaxDJs0
Návštěvník
26. 4. 2013   #9
-
0
-

#4 sleepy

A jak mám vypočítat tu přesnou pozici políčka na které jsem klikl? Zasekl jsem se na tom.

Nahlásit jako SPAM
IP: 83.208.241.–
sleepy0
Stálý člen
27. 4. 2013   #10
-
0
-

Povedzme ze policko ma velkost (50px x 50px) a nech policko 1a zacina na pozicii (x0, y0) pre nas v pravo hore. Takze ak Je zachiteny event nad poziciu (x,y), staci spocitat floor((x,y) - (x0,y0))/50), (cela cast cisla, zaporne ta nezuimaju)->(policko_x, policko_y). 

Napriklad (x0,y0) = (100,100) policko ma velkost 50x50 a kliknute bolo na poziciu (x,y)=(430, 220).

1.) (x,y)-(x0,y0) = (330,120)

2.) (330,130) / 50 (vyska a sirka su rovnake) = (6.6, 2.6) // celociselne delenie ti da aj tak priamo cisla (6,2)

(nepovinne ak pouzivas iba cele cisla) 3.) 6.6 je medzi 6 a 7 cize kliknute bolo na 6 policko a 2.6 je medzi 2 a 3 cize kliknute bolo na 2. policko to iste ti da aj floor()

4.) bacha indexovanie zacina od 0 podla tohto vzorca, cize poloha na sachovnici je 7c.

Sedi to ak si spravis ze 1 zacina je na intervale <100,150); 2 je na <150,200); 3 je na <200, 250); 4 je na <250,300); 5 je na <300,350); 6 je na <350,400); 7 je na <400, 450); 8 je na <450, 500>.

Nahlásit jako SPAM
IP: 158.195.204.–
MaxDJs0
Návštěvník
27. 4. 2013   #11
-
0
-

A jak zjistím to x0, y0?

Nahlásit jako SPAM
IP: 83.208.241.–
MaxDJs0
Návštěvník
27. 4. 2013   #12
-
0
-

#11 MaxDJs
Protože když dám x0 = 0, y0= 0, tak už mi to detekuje pozici políčka docela dobře, ale zhruba od půlky jednoho políčka mi to už detekuje jako to druhé políčko.

Nahlásit jako SPAM
IP: 83.208.241.–
JanH
~ Anonymní uživatel
10 příspěvků
27. 4. 2013   #13
-
0
-

#1 JanH
Dobrý večer,

poprosil bych o další radu.

Při použití metody setElabled() na nějaké tlačítko, se toto tlačítko stane nedostupným a změní se lehce jeho vzhled.
Nešlo by nějak zařídit (přetížit, překrýt nějakou metodu), aby se tlačítko znepřístupnilo, ale jeho vzhled zůstal stejný?

Děkuji.

Nahlásit jako SPAM
IP: 89.190.62.–
JanH
~ Anonymní uživatel
10 příspěvků
27. 4. 2013   #14
-
0
-

#13 JanH
Omlouvám se za chybu. Jedná se o metodu setEnabled.

Nahlásit jako SPAM
IP: 89.190.62.–
Flowy0
Věrný člen
27. 4. 2013   #15
-
0
-

je problem pridat mu premennu ktoru skontrolujes pri kliknuti a blok pokracuje len v pripade true?

Nahlásit jako SPAM
IP: 85.237.227.–
https://github.com/Flowy
JanH
~ Anonymní uživatel
10 příspěvků
27. 4. 2013   #16
-
0
-

#15 Flowy

Mám to nakonec implementované podobně, ale zajímalo by mě, jestli to de.

Nahlásit jako SPAM
IP: 89.190.62.–
sleepy0
Stálý člen
28. 4. 2013   #17
-
0
-

#12 MaxDJs
To x0 a y0 su konstanty, jednoducho su to vzdialenosti v pixeloch medzi bodom (0,0) pri kliknuti mysi a pravym hornym rohom sachovnice, predpokladam ze sachovnica je umiestnena v JPanele (ma svoj vlastny MouseListener), ktory cely vyplna, vtedy mozes dat x0=0 a y0=0, za inych okolnosti treba ziskat polohu x0 a y0. Napriklad to moze byt relativna vzdialenost komponenty vnorenej v inej komponente, ktra implementuje MouseLIstener.

Nahlásit jako SPAM
IP: 158.195.204.–
MaxDJs0
Návštěvník
28. 4. 2013   #18
-
0
-

#17 sleepy
Šachovnice je Grid JBoard a jednotlivá políčka jsou JPanely. MouseListener je na JBoardu. Má to tak být nebo mám mít MouseListener na jednotlivých políčkách?

Nahlásit jako SPAM
IP: 83.208.241.–
sleepy0
Stálý člen
28. 4. 2013   #19
-
0
-

#18 MaxDJs
No ked ho budes mat na polickach nic nemusis pocitat.

Tu je nieco co som teraz zbastlil, upravi si tam musite spravit sami:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.Color;
import java.awt.Dimension;

class ChessBoard extends JPanel implements MouseListener{
	
	public ChessBoard(){
		this.addMouseListener(this);
	}
	
	public void paintComponent(Graphics g){
		for(int n=0; n<64; n++) {
			g.setColor( ((n+n/8)%2==0)?Color.BLACK:Color.WHITE );
			g.fillRect((n%8)*50, (n/8)*50, (n%8)*50+50, (n/8)*50+50);
		}
	}
	
	public void mouseClicked(MouseEvent e){
		System.out.println("Clicked on position ("+e.getX()+","+e.getY()+")");
		int posY = e.getY()/50;
		int posX = (e.getX()/50+1);
		char charPosY = (char)posY;
		charPosY +='a';
		System.out.println("Chess position: "+posX+""+charPosY);
	}
	
	public void mouseExited(MouseEvent e){
		
	}
	
	public void mouseEntered(MouseEvent e){
		
	}
	
	public void mousePressed(MouseEvent e){
		
	}
	
	public void mouseReleased(MouseEvent e){
		
	}
	
	public static void main(String[] arg){
		javax.swing.JFrame frame = new javax.swing.JFrame();
		frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
		frame.setSize(400,420);
		frame.setLayout(new java.awt.GridLayout());
		ChessBoard cb = new ChessBoard();
		frame.add(cb);
		frame.setVisible(true);
	}
}

Kod si upravte podla potreby.

Nahlásit jako SPAM
IP: 158.195.204.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý