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

Här diskuteras programmering och utveckling
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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. :)
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

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

Inlägg 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.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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.
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

ok, jag använder netbeans, och gör GUIn för hand. Jag använder GridBagLayout och en JMenuBar.  :)
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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)?).
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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!
Senast redigerad av 1 gasol, redigerad totalt 25 gånger.
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

Jag lägger upp koden på source-forge senare idag :)
updateUI funkade inte heller =/
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

XD orkar inte source-forge....vart kan jag ladda upp filen?
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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 ;)
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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);
    }
}



Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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 :'()
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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);
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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?
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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.
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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 ^^
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

Den här tråden kommer att vara öppen ifallifall jag behöver mer hjälp :D
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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
Senast redigerad av 1 Galgalid, redigerad totalt 10 gånger.
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

hjälp plz :)
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg 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?
Användarvisningsbild
svartberg
Inlägg: 140
Blev medlem: 27 mar 2007, 00:07
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Ort: Västervik / Trollhättan

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

Inlägg 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  ;)
Senast redigerad av 1 svartberg, redigerad totalt 12 gånger.
Skriv svar

Återgå till "Programmering och webbdesign"