Avatar billede svarejoergen Nybegynder
17. november 2011 - 15:31 Der er 4 kommentarer og
1 løsning

GUI. 3 hurtige spørgsmål

Jeg er ved at lave et Meyer-spil. Det skal være muligt at spille Meyer online mod en AI.

Her er nogle hurtige spørgsmål.

1. Er det problematisk at blande Swing-elementer med AWT-elementer. Hvis ja: Hvilken er så at foretrække?

2. Findes der nogle steder på nettet, hvor kan oprette det som et slags open-source projekt. Så alle kan deltage både med kode og ideer. Savner noget ping-pong med andre, da det gør indlæringsprocessen noget sjovere.

(spørgsmål til koden nederst)
3. Kan jeg lave den øverste del (canvas) større og den midterste del (3 knapper) mindre i dette GridLayout.
Har forsøgt forskellige ting (netbeans drag and drop etc), men synes det er svært at lave en pæn GUI. Synes egentlig den logiske del er nemmere.

package meyer;

//Swing opererer med de her layout managers, som godt kan vaer elidt tricky at forstaa.
// dette er taget fra LayoutFun og modificeret
//Men proev og koer dette programm og leg lidt med at resize vinduet:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class meyerLayout extends JFrame {

    protected JTextArea textArea;

    public meyerLayout() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Meyer");
        setPreferredSize(new Dimension(800, 600));
        getContentPane().setLayout(new GridLayout(3, 1));
       
        JPanel g10 = new JPanel();
        textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        JScrollPane Pane = new JScrollPane(textArea);
        add(Pane);
        g10.setBorder(new EmptyBorder(5, 5, 5, 5));
        g10.setLayout(new BorderLayout());
        g10.add(new JLabel("Meyer"), BorderLayout.NORTH);
        JPanel g10body = new JPanel();
        g10body.setLayout(new BorderLayout());
        g10body.add(new JButton("Nash"), BorderLayout.NORTH);
        g10body.add(new JButton("Player"), BorderLayout.SOUTH);
        g10body.add(Pane, BorderLayout.EAST);
        g10body.add(new JButton("Dices showing current score"), BorderLayout.WEST);
        g10body.add(new JButton("Canvas with dices"), BorderLayout.CENTER);
        g10.add(g10body, BorderLayout.NORTH);
        getContentPane().add(g10);

        JPanel g11 = new JPanel();
        g11.setBorder(new EmptyBorder(5, 5, 5, 5));
        g11.setLayout(new BorderLayout());
        g11.add(new JLabel("Action"), BorderLayout.NORTH);
        JPanel g11body = new JPanel();
        g11body.setLayout(new GridLayout());
        g11body.add(new JButton("Look"));
        g11body.add(new JButton("Roll"));
        g11body.add(new JButton("Pass"));
        g11.add(g11body, BorderLayout.CENTER);
        getContentPane().add(g11);
       
        JPanel g12 = new JPanel();
        g12.setBorder(new EmptyBorder(5, 5, 5, 5));
        g12.setLayout(new BorderLayout());
        g12.add(new JLabel("Announce"), BorderLayout.NORTH);
        JPanel g12body = new JPanel();
        g12body.setLayout(new GridLayout(3, 7));
        g12body.add(new JButton("Gooffy"));
        g12body.add(new JButton("41"));
        g12body.add(new JButton("42"));
        g12body.add(new JButton("43"));
        g12body.add(new JButton("51"));
        g12body.add(new JButton("52"));
        g12body.add(new JButton("53"));
        g12body.add(new JButton("54"));
        g12body.add(new JButton("61"));
        g12body.add(new JButton("62"));
        g12body.add(new JButton("63"));
        g12body.add(new JButton("64"));
        g12body.add(new JButton("65"));
        g12body.add(new JButton("Pair 1"));
        g12body.add(new JButton("Pair 2"));
        g12body.add(new JButton("Pair 3"));
        g12body.add(new JButton("Pair 4"));
        g12body.add(new JButton("Pair 5"));
        g12body.add(new JButton("Pair 6"));
        g12body.add(new JButton("Little Meyer"));
        g12body.add(new JButton("Meyer"));
        g12.add(g12body, BorderLayout.CENTER);
        getContentPane().add(g12);
        pack();

    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new meyerLayout();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede arne_v Ekspert
17. november 2011 - 15:54 #1
re 1)

Du boer ikke blande Swing komponenter som JTextField med AWT komponenter som TextField.

Du boer bruge Swing udgaverne ikke AWT udgaverne.

Men Swing er bygget paa AWT og layout managers events fra AWT er helt OK at bruge i Swing.

re 2)

Masser. SourceForge er mest kendt.

Det er notorisk svaert at skaffe interesse for smaa open source projekter.

re 3)

GridLayout laver saa vidt jeg ved alle komponenter lige store.

Maaske GridBagLayout kan give dem forskellig stoerrelse.
Avatar billede Slettet bruger
17. november 2011 - 20:24 #2
1) Du kan læse lidt mere her (mixing heavy (AWT) and light (Swing) components): http://java.sun.com/products/jfc/tsc/articles/mixing/
Og er enig i at man ikke bør blande de to ting sammen. Du kan sagtens lave det hele i Swing.

3) Med GridBagLayout (som jeg også ville anbefale) får du en masse muligheder for at placere dine komponenter som du ønsker, næsten uanset hvilken størrelse din frame har. Og hvis du tillader at brugeren ændrer størrelsen på vinduet, så vil det stadig se pænt ud, afhængig af de constraints du bruger (f.eks. hvis du har en JLabel og en JTextField ved siden af hinanden, kan du sætte nogle constraints så det kun er JTextField der ændrer størrelse når du ændrer størrelsen på hele vinduet).

Det kan virke mere rodet med GridBagLayout, da du skal bruge GridBagConstraints til at definere dine constraints på dine komponenter, men fordelen er at du får en meget fleksibel GUI. Det kommer selvfølgelig an på hvad du har behov for, så hvis der er nogen af de andre og simplere layouts der kan gøre det, så brug dem i stedet.
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html
Avatar billede svarejoergen Nybegynder
18. november 2011 - 13:36 #3
Tak for gode svar!

Har været inde og finde nogle eksempler på Source forge (bliv ikke overrasket hvis der på et tidspunkt kommer et spørgsmål omkring mærkelige efternavne på filer). Fint site.
Lyder som om GridBagLayout er lige hvad jeg har brug for. Glæder mig til at eksperimentere med GridBagLayout på mandag (er offline i weekenden).
Dejligt med konstruktiv respons. Jeg kommer nok til at poste herinde igen omkring mit lille projekt. Alle der gerne vil deltage er selvfølgelig mere end velkommen.

Begge svar har selvfølgelig fortjent point.
Avatar billede arne_v Ekspert
19. november 2011 - 00:34 #4
svar fra mig
Avatar billede Slettet bruger
19. november 2011 - 16:37 #5
Jeg samler ikke point, men ellers tak. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester