Powie mi ktoś co poprawić? z góry thx NOTATNIK W JAVIE

0
  1. Menu nie chcę się wyświetlić tzn . MenuBar

Z góry chciałem zaznaczyć że dopiero zaczynam, i przepraszam za "głupie" posty.


package notatnik;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import static javax.swing.KeyStroke.getKeyStroke;
 
 
public class ActionFrame extends JFrame implements NewInterface {
 
            private JTextArea t1;
            private MenuBar m1;
            private JMenu m2;
            private JMenuItem zapisz, otworz, kopiuj, wklej;
            private JButton button1, button2;
            private JComboBox combo1;
            private JPopupMenu jpm;
            private File plik;
            private String copy="";
 
    public ActionFrame(){
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width) / 2;
        int y = (d.height) / 2;
        setSize(x, y);
        setLayout(null);
        /// Ustawianie okna i  tytułu
 
        m1 = new MenuBar();
        setMenuBar(m1);
        m2= new JMenu("Plik");
        m2.setBounds(10, 10, 25, 50);
        add(m2);
        zapisz = new JMenuItem("zapisz");
        add(zapisz);
        otworz = new JMenuItem("otworz");
        add(otworz);
        m2.add(zapisz);
        m2.add(otworz);
        /// Menu i jego elementy
 
        t1 = new JTextArea("Tu wpisuj tekst");
        t1.setForeground(Color.green);
        t1.setBackground(Color.WHITE);
        t1.setBounds(50, 50, 500, 600);
        JScrollPane jsp = new JScrollPane(t1);
        jsp.setBounds(50, 50, 500, 600);
        add(jsp);
        /// Miejsce notatnika illPane
 
        button1 = new JButton("zapis");
        button1.setBackground(Color.red);
        button1.setBounds(550, 350, 150, 100);
        add(button1);
        button1.addActionListener(this);
 
        button2 = new JButton("otworz");
        button2.setBackground(Color.red);
        button2.setBounds(550, 250, 150, 100);
        add(button2);
        button2.addActionListener(this);
        /// Przycisk Zapisz i Otworz
        combo1 = new JComboBox();
        combo1.setBounds(550, 150, 150, 100);
        combo1.addItem("zielony");
        combo1.addItem("czarny");
        combo1.addItem("czerwony");
        combo1.addItem("szary");
        combo1.addItem("biały");
        add(combo1);
        combo1.addActionListener(this);
        /// JComboBox do zmiany koloru
 
        jpm = new JPopupMenu();
        kopiuj = new JMenuItem("kopiuj");
        kopiuj.setAccelerator(KeyStroke.getKeyStroke("ctrl + c"));
        wklej = new JMenuItem("wklej");
        wklej.setAccelerator(KeyStroke.getKeyStroke("ctrl + v"));
        kopiuj.addActionListener(this);
        wklej.addActionListener(this);
        t1.setComponentPopupMenu(jpm);
        jpm.add(kopiuj);
        jpm.add(wklej);
 
        /// JPopupMenu
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
 public void actionPerformed(ActionEvent e){
     Object c = e.getSource();
 
        if(c==combo1){
         String color;
         color = combo1.getSelectedItem().toString();
         if(color.equals("zielony")){
             t1.setBackground(Color.green);
         }        
         if(color.equals("czarny")){
             t1.setBackground(Color.BLACK);
             t1.setFont(new Font("SansSerif", Font.BOLD ,15));
         }
         if(color.equals("czerwony")){
             t1.setBackground(Color.RED);
         } 
         if(color.equals("szary")){
             t1.setBackground(Color.GRAY);
         }
         if(color.equals("biały")){
             t1.setBackground(Color.GREEN);
         }
 
     }
     else if(c==kopiuj){
            t1.copy();
        }
     else if(c==wklej){
            t1.paste();
        }
 
     else if(c==zapisz || c==button1){
                  JFileChooser jc = new JFileChooser();
                  PrintWriter pw =null;
         if(jc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION){
             File plik = jc.getSelectedFile();
                      try {
                          pw = new PrintWriter(plik);
                      }
                      catch (FileNotFoundException ex) {
                          Logger.getLogger(ActionFrame.class.getName()).log(Level.SEVERE, null, ex);
                      }
             Scanner in = new Scanner(t1.getText());
             while(in.hasNext()){
                 pw.println(in.nextLine()+"\n");
          }
        }
         pw.close();
    }
     else if(c==otworz || c==button2){

         
         JFileChooser jfc = new JFileChooser();
         if(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION){
         File plik = jfc.getSelectedFile();
 
             Scanner scaner = null;
             try {
                 scaner = new Scanner(plik);
                 t1.setText("");
             } catch (FileNotFoundException ex) {
                 Logger.getLogger(ActionFrame.class.getName()).log(Level.SEVERE, null, ex);
             }
             while(scaner.hasNext()){
                 t1.append(scaner.nextLine()+"\n");
             }
 
          }
      }
    }
   }
package notatnik;

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Notatnik {
    public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
			new ActionFrame(); 
		  }
		});
    }
    
}

PS. A i program nie jest na żadne zaliczenie żeby ktoś nie myślał że go wyzyskuję, mam 17 lat.

1

JTextArea "z urzędu" współpracuje ze schowkiem. Wystarczy

     else if(c==kopiuj){
            t1.copy();
        }
     else if(c==wklej){
            t1.paste();
        }
1

Wyglądem programów, w których jest

setLayout(null);

się nie zajmuje. Błędna jest na pewno instukcjaadd(t1);.Jej nie powinno być.
Tworzenie na nowo obiektów typu JFileChooser po każdym kliknięciu w odpowiedni przycisk jest skrajnie niewygodne dla użytkownika programu. Po kliknięciu w zapisz próbujesz czytać i na odwrót.

1
  1. Nie prowadź dyskusji w komentarzu.
  2. W JFrame używaj JMenuBar i metody setJMenuBar. Czy to wystarczy, to nie wiem. Dla pozostałych komponentów ustalasz położenie i rozmiar, dla MenuBar nie.
    Przemyśl co do czego dodajesz w poniższym kodzie;
        m1 = new MenuBar();
        setMenuBar(m1);
        m2= new JMenu("Plik");
        m2.setBounds(10, 10, 25, 50);
        add(m2);
        zapisz = new JMenuItem("zapisz");
        add(zapisz);
        otworz = new JMenuItem("otworz");
        add(otworz);
        m2.add(zapisz);
        m2.add(otworz);

Kod ten wygląda cudacznie.
Niech JFileChooser będzie polem w klasie

...
private File plik;
private String copy="";
private JFileChooser jfc = new JFileChooser(); 

public ActionFrame(){
0

Niestety menu ciągle nie istnieje, a kiedy zmieniłem na JMenuBar, i ustawiłem położenie i rozmiar to jest to menu "plik" ale martwe i nie da się go nawet rozwinąć...

1

A ten absurdalny kod, który cytowałem w poprzednim poście poprawiłeś? Kod powinien wyglądać mniej więcej tak:

        JMenuBar menuBar = new JMenuBar();

        JMenu menu = new JMenu("Plik");
        menu.setMnemonic(KeyEvent.VK_P);
        JMenuItem mi = new JMenuItem("Nowy",KeyEvent.VK_N);
        mi.addActionListener(this);
        mi.setAccelerator(KeyStroke.getKeyStroke('N',InputEvent.CTRL_MASK));
        menu.add(mi);

        mi = new JMenuItem("Otwórz",KeyEvent.VK_O);
        mi.addActionListener(this);
        mi.setAccelerator(KeyStroke.getKeyStroke('O',InputEvent.CTRL_MASK));
        menu.add(mi);

        saveItem = new JMenuItem("Zapisz",KeyEvent.VK_S);
        saveItem.addActionListener(this);
        saveItem.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK));
        saveItem.setEnabled(false);
        menu.add(saveItem);

        mi = new JMenuItem("Zapisz jako",KeyEvent.VK_J);
        mi.addActionListener(this);
        mi.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK+InputEvent.SHIFT_MASK));
        menu.add(mi);

        mi = new JMenuItem("Wstaw plik",KeyEvent.VK_W);
        mi.addActionListener(this);
        menu.add(mi);
        menu.addSeparator();

        mi = new JMenuItem("Drukuj",KeyEvent.VK_D);
        mi.setAccelerator(KeyStroke.getKeyStroke('P',InputEvent.CTRL_MASK));
        mi.addActionListener(this);
        menu.add(mi);

        m.addSeparator();

        mi = new JMenuItem("Koniec",KeyEvent.VK_K);
        mi.addActionListener(end);
        mi.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.ALT_MASK));
        menu.add(mi);
        
        menuBar.add(menu);
...
        setJMenuBar(menuBar);

Większość pozycji w menu to zmienne lokalne - zamień je na pola w klasie.
Edytor.png

0

tak stworzyłem na starcie obiekt JFileChooser, i nie musiałem potem go wywoływać.

2

Jak widzę w kodzie addActionListener(this); a w tym biednym actionPerformed drabinkę ifów to aż mi się robi smutno. Tak trudno po prostu zrobić kilka action listenerów albo w ogóle upchnąć tam lamdy?

1

@Shalom, identyczną akcję w programie można wywołać na kilka sposobów. Np. przez menu, przycisk w pasku narzędzi, menu kontekstowe. Powoduje to, że kod typu

button.addActionListener(new ActionListener()
{
...
});

jest mało sensowny. Alternatywą jest tworzenie ciągu listenerów, coś w rodzaju:

private ActionListener opener = new ActionListener(){
    public void actionPerformed(ActionEvent ae){
        open();
    }
};
...
button.addActionListener(opener);

Mi się robi bardzo smutno :( gdy widzę ciąg takich definicji, wolę jedną funkcję actionPerformed i ciąg ifów.

1

Nie, alternatywa to osobny pakiet i kilka małych osobnych klas na te action listenery.
Zresztą ciekawe jak chcesz robić tą drabinke jak jedna akcja jest odpalana z różnych miejsc. If source== buttonX or source==menuY or...? Genialne! Tylko po co skoro można się obejść bez tego kodu i nie trzeba potem pamiętać że jak dodajesz nowe menu to musisz zmieniać istniejący kod? Mówi ci coś open-closed rule? Jak masz osobna klase dla listenera to dodanie nowego menu nie wymaga żadnych (!) modyfikacji istniejącego kodu...

1

@KiedysBedeNerdem, znów ciągniesz wątek w komentarzach.

private void changeColor(){
     Color color = JColorChooser.showDialog(null,"Kolor tekstu",ta.getForeground());
     if (kolor != null)
     {
          ta.setForeground(kolor);
     }
     return;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1