Sida 1 av 2

Hjälp med mitt första riktiga program =D(Java)

Postat: 24 jun 2007, 21:23
av Galgalid
Håller nu på med mitt första riktiga projekt, en text-editor som passar mina behov. Det mesta av det grafiska användargränssnittet är klart. Problemet är att menyraden döljs när jag kör programet. För att få den att visas är jag tvungen att förstora fönstret, vilket i sin tur innebär att själva text-fältet inte fyller hela skärmen.
Hur ska jag få menyraden att visas från början, och göra så att TextArean ändras till en nice storlek, beroende på hur användar denfinerar om storleken på programet. Förklara gärna grundligt, eftetsom jag började med Swing för bara 1 1/2 vecka sedan. :)

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 24 jun 2007, 22:18
av TicToc
Sitter du i någon form av IDE, utvecklingsmiljö, eller gör du det krångligt för dig?  :)
Själv sitter jag i netbeans, och det du beskriver 'bara fungerar' i exv netbeans.
Förståelse är bra, men i längden är det bara trist att skapa GUIs för hand, tycker jag.

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 24 jun 2007, 23:19
av Okänd
Använder du en JMenuBar men för att skapa din menu bar eller använder du en JPanel eller dylikt. Samt vilken sorts layout använder du?

Swing använder sig av olika layouts för att definera var dina gui komponenter kommer att placeras, jag skulle rekomendera att du använder dig av en borderlayout där du lägger din meny längst upp och sedan din text-area i center området, detta kommer att medför att din menybar kommer att ta upp så mycket plats den behöver och all plats som blir över kommer din text-area att ta upp.

Här står det lite om layouts och hur dom fungerar.
http://java.sun.com/docs/books/tutorial ... isual.html

I java är det en tumregel att _inte_ manuellt säga hur stora gui komponenter ska vara utan låta layouten bestämma detta, på så sätt så slipper man böket med att manuellt ändra storlek på alla komponenter när man byter storlek på fönstret.

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 00:54
av Galgalid
ok, jag använder netbeans, och gör GUIn för hand. Jag använder GridBagLayout och en JMenuBar.  :)

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 10:03
av Galgalid
Har nu fått TextArean att ändra storlek när man ändrar 'size' på programet. Använder GridLayout nu, vilket passar mig lite bättre. Problemet med att JMenuBar inte visas från början kvarstår dock...ska visa:  så här ser det ut innan jag har ändrat storleken på fönstret: http://i189.photobucket.com/albums/z254/Galgalid/case1.jpg.
Såhär set det ut efter att jag har ändrat storleken på fönstret: http://i189.photobucket.com/albums/z254/Galgalid/case2.jpg

Vad gör jag för att få menyraden att visas direkt?(skulle det påverka o jag lade en toolbar under menyraden(ska göra det sen)?).

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 15:42
av Okänd
I vilken ordning lägger du in komponenterna?

Har du testat att anropa metoden updateUI(void) på den? typ när du har lagt in all komponenter och är klar?

Om det inte funkar så kan du ju posta koden så ska jag ta å kolla lite mer på det...

edit: jag tycker att du gör rätt när du iaf skriva din första GUI själv, det kan bli mycket bök att försöka hitta fel i autogenererad kod senare annars!

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 17:26
av Galgalid
Jag lägger upp koden på source-forge senare idag :)
updateUI funkade inte heller =/

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 21:57
av Galgalid
XD orkar inte source-forge....vart kan jag ladda upp filen?

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 22:07
av Galgalid
rapidshare is your friend..if you pay :o

http://rapidshare.com/files/39321613/Main.java

Skratta gärna åt mitt klumpiga försök att skriva ett program ;)

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 22:54
av Okänd
Det verkade som att du använde en MenuBar istället för en JMenuBar, alltså gammla AWT komponenter, inget fel på dom iofs, men man ska helst inte bland Swing och AWT komponenter, sedan så bör du verkligen undvika att använda depricated funktioner.

Jag gjorde lite ändringar i din kod och fixxade in en JMenubar samt så la jag till en action listener som ett exempel jag har kommenterat allt jag gjort (tror jag)

edit: om den inte kompilerar så blev det nåt bök när jag klistrade in koden från vim till firefox...

Kod: Markera allt

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;




/* den här klassen vill implementera ActionListener så du kan hantera
 * events från din meny.. */
public class Main extends JFrame implements ActionListener {

   /*det är mycket smidigare om din klass äger dom här istället för 
    * att använda sig av nåt knepigt AWT interface */
   private JMenuBar bar;
   private JMenu file, edit, about;

    /* Beginning of own methods */
    //Setting the GUI 
    public void setLookAndFeel() {

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            SwingUtilities.updateComponentTreeUI(this);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                  "Couldn't load SystemLookAndFeel" +
                  "changing to CrossPlatForLookAndFeel", "Error",
                  JOptionPane.ERROR_MESSAGE);
        }

        if (UIManager.getSystemLookAndFeelClassName() == null) {
            try {
                 UIManager.setLookAndFeel(UIManager.
                       getCrossPlatformLookAndFeelClassName());
            SwingUtilities.updateComponentTreeUI(this);
            } catch (Exception e) {
                 JOptionPane.showMessageDialog(null,
                       "Apep Text Editor was unable to load the graphical" +
                       "interface. Try restarting or"  +
                       "re-installing the application",
                        "Error", JOptionPane.ERROR_MESSAGE);
            }
        } else {

        }
    }

    //Help-method for GridBagLayout

    void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw,
          int gh, int wx, int wy) {
        gbc.gridx = gx;
        gbc.gridy = gy;
        gbc.gridwidth = gw;
        gbc.gridheight = gh;
        gbc.weightx = wx;
        gbc.weighty = wy;
            }

 /* End of own methods */
   public void actionPerformed(ActionEvent e) {

      if(e.getActionCommand().equals("new file")) {
         System.out.print("weee\n");
         /* TODO: ropa på nån lämplig metod ^_^ */
      }
      /* else if osv.. */

   }


    Main() {

        super("Apep text Editor");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Setting the looks
        setLookAndFeel();
        GridLayout grid = new GridLayout(1,1);

        bar = new JMenuBar();

        file = new JMenu("File");


        /* egentligen så behöver inte alla dom här ha en egen variabel, 
         * utan det räcker med att du har typ item, och sedan kör du 
         * item = new JMenuItem("New  Ctrl + N"); 
         * item.addActionListener(this);
         * item.setActionCommand("new file");
         * file.add(item);
         * item = new JMenuItem("New  Ctrl + N");
         * item.addActionListener(this);
         * item.setActionCommand("new file");
         * file.add(item); 
         * osv...
         * */

        JMenuItem fileNew = new JMenuItem("New File");
        /*om du använder Accelrators så behöver 
         * du inte skriva ut Ctrl + N själv*/
        fileNew.setAccelerator(KeyStroke.getKeyStroke(
                         KeyEvent.VK_N, ActionEvent.CTRL_MASK));

        /* this är en referens till objektet som skapas när du kör konstruktorn
         * alltså våran JFrame, eftersom den implementerar ActionListener 
         * interfacet så skickar vi med det som argument till den här
         * metoden (alltså varje gång man klickar på New File knappen
         * så körs actionPerformed metoden)*/
        fileNew.addActionListener(this);

        /* det här är det så kallade action commandet som gör att vi kan lista
         * ut vilken knapp på vilken meny som användaren klickade på. Detta går
         * iofs att lösa med subklasser som implemneterar ActionListener 
         * interfacet vilket nog vore en lite snyggare lösning... */
        fileNew.setActionCommand("new file");

        JMenuItem fileOpen = new JMenuItem("Open  Ctrl + O");
      JMenuItem fileSave = new JMenuItem("Save  Ctrl + S");
        JMenuItem fileSaveAs = new JMenuItem("Save as");
        JMenuItem filePrint = new JMenuItem("Print  Ctrl + P");
        JMenuItem fileQuit = new JMenuItem("Quit  Ctrl + Q");

        //Creating the edit meny
        JMenu edit = new JMenu("Edit");
        JMenuItem editCut = new JMenuItem("Cut");
        JMenuItem editCopy = new JMenuItem("Copy  Ctrl + C");
        JMenuItem editPaste = new JMenuItem("Paste  Ctrl + V");
        JMenuItem editSelectAll = new JMenuItem("Select all  Ctrl + A");
        //creating the about menu
        JMenu about = new JMenu("About");
        JMenuItem aboutApeptextEditor = new JMenuItem("Apep Text Editor");
        JMenuItem aboutCreator = new JMenuItem("Creator");
        JMenuItem aboutLicense = new JMenuItem("License");
        //creating the text-area and a ScrollPane
        JTextArea mainTextArea = new JTextArea(22,37);
        JScrollPane scrollerTextArea = new JScrollPane(mainTextArea,
              JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
              JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        bar.add(file);
        bar.add(edit);
        bar.add(about);


        //adding the File menu
        file.add(fileNew);
        file.add(fileOpen);
        file.addSeparator();
        file.add(fileSave);
        file.add(fileSaveAs);
        file.addSeparator();
        file.add(filePrint);
        file.add(fileQuit);
        //adding the edit menu
        edit.add(editCut);
        edit.add(editCopy);
        edit.add(editPaste);
        edit.addSeparator();
        edit.add(editSelectAll);
        // adding the about menu
        about.add(aboutApeptextEditor);
        about.addSeparator();
        about.add(aboutCreator);
        about.add(aboutLicense);
        JMenuBar bar = new JMenuBar();

        //adding them to the menu bar
        bar.add(file);
        bar.add(edit);
        bar.add(about);

        setJMenuBar(bar);

        add(mainTextArea);

        //Setting up how the textArea will work
        //Note that JScrollPane scrollerTextArea is bound to mainTextArea. 
        //Add the scroller to the pane.

        mainTextArea.setEditable(true);
        mainTextArea.setEnabled(true);


        pack();
    }

    public static void main(String[] arguments) {
        JFrame frame = new Main();
        //se till att visa framen...
        frame.setVisible(true);
    }
}




SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 23:02
av Galgalid
Det gick inte att kompilera: såhär sa NetBeans:

java.lang.Error: Do not use Main.add() use Main.getContentPane().add() instead

        at javax.swing.JFrame.createRootPaneException(JFrame.java:465)

        at javax.swing.JFrame.addImpl(JFrame.java:491)

        at java.awt.Container.add(Container.java:307)

        at Main.<init>(Main.java:176)

        at Main.main(Main.java:190)

Exception in thread "main"

Java Result: 1


XD jag har aldrig använt en actionlistner förrut så jag kan dom inte alls.....och att blanda AWT och Swing...jag har bara 1 bok om Java, och där har författaren blandat Swing med AWT(vilket är väldigt förrvirande :'()

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 23:13
av Okänd
hmmm... det funkar fint när jag kompilerar, vilken java kompilator använder NetBeans ?

testa å byt ut raden (rad 176):
add(mainTextArea);
med
getContentPane().add(mainTextArea);

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 23:16
av Galgalid
Tackar, nu funkar det finfint...ska lägga mig nu så hinner inte studera koden mycket, men hur gjorde du för att menyraden skulle visas?

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 23:21
av Okänd
eftersom jag inte har kodat mkt alls med AWT så är jag inte riktigt säker på varför den inte syntes, så jag skrev bara om den lite snabbt till en Swing komponent och då fungeradet det. Te.x. metoden show(void) är depricated så det kan ha varit nåt så enkelt som det, fick du inga varningar för det när du kompilerade?

Eller så var det kanske att layouterna inte funkade så bra mellan AWT & Swing komponenter.

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 25 jun 2007, 23:25
av Galgalid
Nej, ingen varning med show...ska prova att använda mitt gamla och ersätta show med setVisible(true)

Tack för hjälpen ^^

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 26 jun 2007, 12:01
av Galgalid
Den här tråden kommer att vara öppen ifallifall jag behöver mer hjälp :D

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 10 jul 2007, 19:38
av Galgalid
Nu är det dags igen. Jag har gjort en JMenuBar, i den finns 3 JMenus, och varje JMenu har ett x antal JMenuItem's. Jag försökte få någotr att hända när jag tryckte på ett Item, men det står att den inte kan hitta variabeln fileQuit(ett menyalternativ i File-menyn)

Det ser ut såhär:

public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == fileQuit) {
    System.exit(0) //antar att detta stänger av programet
    }
}

Det står dock att den inte kan hitta variabeln fileQuit...trots att jag har skapat den:

JMenuItem fileQuit = new JMenuItem("Quit")

Vad gör jag för fel?

och ja, jag har lagt till en actionListener till fileQuit ;)

sen så vill jag att i about-menyn,  om jag trycker på ett alternativ så ska stuff komma  upp i en seperat ruta. Gör jag då typ en ny klass som ärver ifrån JWindow/JPanel?  hur fungerar det?

I'm still a noob :D

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 11 jul 2007, 19:13
av Galgalid
hjälp plz :)

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 12 jul 2007, 00:26
av Galgalid
Lyckades lösa problemet själv, men nu har jag ytterliggare 1 fråga ;D

Jag vill att när jag trycker på en knapp så kommer en seperat ruta upp(tänkte fixa licens, givetivs GPL ;))..hur gör jag det?

SV: Hjälp med mitt första riktiga program =D(Java)

Postat: 12 jul 2007, 17:18
av svartberg
Galgalid skrev: Lyckades lösa problemet själv, men nu har jag ytterliggare 1 fråga ;D

Jag vill att när jag trycker på en knapp så kommer en seperat ruta upp(tänkte fixa licens, givetivs GPL ;))..hur gör jag det?
Med ruta antar jag att du menar fönster, detta kan du göra med hjälp av att subklassa en JFrame som är ett fönster. Så brukar jag göra mina rutor :)
Om du vill göra ett fönster där det endast finns ett kryssruta såsom en dialog kan du använda dig av JOptionPane och skapa eget innehåll i dess contentPane. Enklast är nog dock att subklassa JFrame men vet i tusan vilket som blir snyggast för användaren, det får du avgöra  ;)