Suche Verbesserungsvorschläge für mein erstes Programm

Status
Nicht offen für weitere Antworten.

lordpatman

Mitglied
hi,
ich habe als übung mal einen sehr einfachen texteditor geschrieben. ich möchte nun gerne von euch ein paar verbesserungsvorschläge und tipps erhalten (z.b. wie ich den code auslagern könnte und das ganze übersichtlicher machen kann oder das mit dem menü und der toolbar vereinfachen könnte). außerdem habe ich noch eine frage zu copy und paste. wie bekomme ich es hin, nur den ausgwählten text in einer jtextarea anzusprechen?

hier mal mein sourcecode:

Code:
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class MainFrame extends JFrame
{
  private JLabel statusLabel;
  private JMenu fileMenu;
  private JMenu editMenu;
  private JMenu helpMenu;
  private JMenuBar menuBar;
  private JMenuItem newAct;
  private JMenuItem openAct;
  private JMenuItem saveAct;
  private JMenuItem saveAsAct;
  private JMenuItem quitAct;
  private JMenuItem cutAct;
  private JMenuItem copyAct;
  private JMenuItem pasteAct;
  private JMenuItem aboutAct;
  private JScrollPane scrollPane;
  private JTextArea textArea;
  
  public MainFrame()
  {
    setTitle("Unbenannt - jEdit-Lite");
    setSize(450, 350);
    Toolkit tool = this.getToolkit();
    Image image = tool.getImage("images/txt.png");
    setIconImage(image); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
  
    createMenus();
    
    textArea = new JTextArea();
    scrollPane = new JScrollPane(textArea);
    
    statusLabel = new JLabel();
    statusLabel.setText("Bereit");

    add(createToolBar(), BorderLayout.NORTH);
    add(scrollPane, BorderLayout.CENTER);
    add(statusLabel, BorderLayout.SOUTH);
    
    setVisible(true);
  }
  
  private void createMenus()
  {
    menuBar = new JMenuBar();
    
    // file-menu
    fileMenu = new JMenu("Datei");
    fileMenu.setMnemonic(KeyEvent.VK_D);
    
    newAct = new JMenuItem("Neu", new ImageIcon("images/new.png"));
    newAct.setMnemonic(KeyEvent.VK_N);
    newAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,  ActionEvent.CTRL_MASK));
    newAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        newFile();
      }
    });
    fileMenu.add(newAct);
    
    fileMenu.addSeparator();
    
    openAct = new JMenuItem("Öffnen", new ImageIcon("images/open.png"));
    openAct.setMnemonic(KeyEvent.VK_F);
    openAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,  ActionEvent.CTRL_MASK));
    openAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        open();
      }
    });
    fileMenu.add(openAct);
    
    fileMenu.addSeparator();
    
    saveAct = new JMenuItem("Speichern", new ImageIcon("images/save.png"));
    saveAct.setMnemonic(KeyEvent.VK_P);
    saveAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,  ActionEvent.CTRL_MASK));
    saveAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Speichern");
      }
    });
    fileMenu.add(saveAct);
    
    saveAsAct = new JMenuItem("Speichern unter ...", new ImageIcon("images/saveas.png"));
    saveAsAct.setMnemonic(KeyEvent.VK_U);
    saveAsAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        saveAs();
      }
    });
    fileMenu.add(saveAsAct);
    
    fileMenu.addSeparator();
    
    quitAct = new JMenuItem("Beenden", new ImageIcon("images/exit.png"));
    quitAct.setMnemonic(KeyEvent.VK_E);
    quitAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,  ActionEvent.CTRL_MASK));
    quitAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        setVisible(false);
        dispose();
        System.exit(0);
      }
    });
    fileMenu.add(quitAct);
    
    menuBar.add(fileMenu);
    
    // edit-menu
    editMenu = new JMenu("Bearbeiten");
    editMenu.setMnemonic(KeyEvent.VK_B);
    
    cutAct = new JMenuItem("Ausschneiden", new ImageIcon("images/cut.png"));
    cutAct.setMnemonic(KeyEvent.VK_A);
    cutAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
    cutAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        cut();
      }
    });
    editMenu.add(cutAct);
    
    copyAct = new JMenuItem("Kopieren", new ImageIcon("images/copy.png"));
    copyAct.setMnemonic(KeyEvent.VK_K);
    copyAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
    copyAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        copy();
      }
    });
    editMenu.add(copyAct);
    
    pasteAct = new JMenuItem("Einfügen", new ImageIcon("images/paste.png"));
    pasteAct.setMnemonic(KeyEvent.VK_F);
    pasteAct.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));
    pasteAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        paste();
      }
    });
    editMenu.add(pasteAct);
    
    menuBar.add(editMenu);
    
    // help-menu
    helpMenu = new JMenu("Hilfe");
    helpMenu.setMnemonic(KeyEvent.VK_H);
    
    aboutAct = new JMenuItem("Über", new ImageIcon("images/about.png"));
    aboutAct.setMnemonic(KeyEvent.VK_B);
    aboutAct.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        about();
      }
    });
    helpMenu.add(aboutAct);
    
    menuBar.add(helpMenu);
    
    setJMenuBar(menuBar);
  }
  
  private JToolBar createToolBar()
  {
    JToolBar toolBar = new JToolBar("Tool bar");
    
    JButton newButton = new JButton(new ImageIcon("images/new.png"));
    newButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        newFile();
      }
    });
    toolBar.add(newButton);
    
    JButton openButton = new JButton(new ImageIcon("images/open.png"));
    openButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        open();
      }
    });
    toolBar.add(openButton);
    
    toolBar.addSeparator();
    
    JButton saveButton = new JButton(new ImageIcon("images/save.png"));
    saveButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Speichern");
      }
    });
    toolBar.add(saveButton);
    
    JButton saveAsButton = new JButton(new ImageIcon("images/saveas.png"));
    saveAsButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        saveAs();
      }
    });
    toolBar.add(saveAsButton);
    
    toolBar.addSeparator();
    
    JButton cutButton = new JButton(new ImageIcon("images/cut.png"));
    cutButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        cut();
      }
    });
    toolBar.add(cutButton);
    
    JButton copyButton = new JButton(new ImageIcon("images/copy.png"));
    copyButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        copy();
      }
    });
    toolBar.add(copyButton);
    
    JButton pasteButton = new JButton(new ImageIcon("images/paste.png"));
    pasteButton.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        paste();
      }
    });
    toolBar.add(pasteButton);
    
    return toolBar;
  }
  
  private void newFile()
   {
     textArea.setText("");
     statusLabel.setText("Bereit");
     setTitle("Unbenannt - jEdit-Lite");
   }
   
   private void open()
   {
     File file;
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Öffnen");
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showOpenDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedReader reader = new BufferedReader(new FileReader(file));
         String text = "";
         
         while((text = reader.readLine()) != null) 
         {
           textArea.append(text + System.getProperty("line.separator"));
         }
         
         reader.close();
         
         statusLabel.setText(file.getName() + " erfolgreich geöffnet");
         setTitle(file.getName() + " - jEdit-Lite");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
   }
   
   private void saveAs()
   {
     File file;
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Speichern unter ...");
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showSaveDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
   }
   
   private void cut()
   {
     copy();
     textArea.setText("");
   }
   
   private void copy()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     String text = textArea.getText();
     StringSelection contents = new StringSelection(text);
     
     cb.setContents(contents, null);
   }
   
   private void paste()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     Transferable content = cb.getContents(this);
     
     try
     {
       String text = (String)content.getTransferData(DataFlavor.stringFlavor);
       textArea.setText(text);
     }
     catch(Throwable e)
     {
       e.printStackTrace();
     }
   }
   
   private void about()
   {
     JOptionPane.showMessageDialog(this, "jEdit-Lite 0.1");
   }
   
  public static void main(String[] args)
  {
    new MainFrame();
  }
}

danke schonmal.
 

AlArenal

Top Contributor
Ich erkenne auf Anhieb eine viel praktizierte suboptimale Praxis, wie man sie leider auch in vielen Anleitungen und Büchern findet. In nem Kommentar zu einem Weblog-Eintrag bzgl. des neuen JSR 296 fanden sich ein paar typische Fehler in Swing-Anwendungen, darunter auch:

- your application is a JFrame

Hintergrund:
Wenn mans vom OOP-Design-Standpunkt aus betrachtet ist eine Swing-Anwendung mit einem JFrame eben eine Anwendung, die einen JFrame anzeigt und kein JFrame, der eine Anwendung beinhaltet. ;)
Eine Trennung von Business-Logik und UI findet bei dir z.B. nicht statt.
 

lordpatman

Mitglied
danke, genau das habe ich schon vermutet, kann mir vielleicht jemand einen tipp oder hinweis geben, wie ich die funktionen in eine extra klasse unterbringen kann, sodass die trennung erfüllt ist.
 

foobar

Top Contributor
Hintergrund:
Wenn mans vom OOP-Design-Standpunkt aus betrachtet ist eine Swing-Anwendung mit einem JFrame eben eine Anwendung, die einen JFrame anzeigt und kein JFrame, der eine Anwendung beinhaltet. icon_wink.gif
Eine Trennung von Business-Logik und UI findet bei dir z.B. nicht statt.

Hmm, was ist denn an HAS-A objektorientierter als an IS-A? Solange man GUI und Geschäftslogik trennt, kann man ruhig eine Klasse von JFrame ableiten.
 

lordpatman

Mitglied
habe grad was über "Actions" entdeckt. könnte ich damit vielleicht meine JMenuItems und die JButtons für die toolbar ersetzen, sodass ich nur noch eine Action habe statt diesem doppelt gemoppelten. kann ich bei der action dann auch setMnemonic und setAccelerator etc. anwenden?
 

AlArenal

Top Contributor
foobar hat gesagt.:
Hmm, was ist denn an HAS-A objektorientierter als an IS-A? Solange man GUI und Geschäftslogik trennt, kann man ruhig eine Klasse von JFrame ableiten.

Und wie soll diese Trennung funktionieren, wenn das ganze Programm aus nur einer Klasse besteht, die von JFrame abgeleitet ist?
 

byte

Top Contributor
foobar hat gesagt.:
Hmm, was ist denn an HAS-A objektorientierter als an IS-A? Solange man GUI und Geschäftslogik trennt, kann man ruhig eine Klasse von JFrame ableiten.

Der Pattern-Guru Erich Gamma schreibt dazu:

Ziehe Objektkomposition der Klassenvererbung vor.
(...)
Gleichwohl ist es unsere Erfahrung, dass Entwickler Vererbung als Technik der Wiederverwendung überstrapazieren. Entwürfe können durch den verstärkten Einsatz von Objektkomposition häufig einfacher und leichter wiederverwendbar gemacht werden. (...)

Siehe: Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software
 

foobar

Top Contributor
Und wie soll diese Trennung funktionieren, wenn das ganze Programm aus nur einer Klasse besteht, die von JFrame abgeleitet ist?
Achso meinst du das. Naja ein Programm das aus einer Klasse besteht kann man auch nicht erstnehmen. Ausser es ist ein ProofOfConcept oder ähnliches.

Ich teile das meistens in Starter und MainFrame auf. Der Starter hat eine Main-Methode und initialisert die Anwendung und der MainFrame baut die GUI aus den einzelnen Teilen zusammen.
 

AlArenal

Top Contributor
byto hat gesagt.:
Der Pattern-Guru Erich Gamma schreibt dazu:

Wobei ich bei Schweizern vorsichtig bin.. Wirths Schöpfungen haben mich irgendwie nicht wirklich überzeugt... obowhl der P-Code durchaus Vorläufer der VM von Smalltalk sein könnte...
 

AlArenal

Top Contributor
foobar hat gesagt.:
Und wie soll diese Trennung funktionieren, wenn das ganze Programm aus nur einer Klasse besteht, die von JFrame abgeleitet ist?
Achso meinst du das. Naja ein Programm das aus einer Klasse besteht kann man auch nicht erstnehmen. Ausser es ist ein ProofOfConcept oder ähnliches.

Ich teile das meistens in Starter und MainFrame auf. Der Starter hat eine Main-Methode und initialisert die Anwendung und der MainFrame baut die GUI aus den einzelnen Teilen zusammen.

's wird Zeit für JSR 296 ;)
 

foobar

Top Contributor
AlArenal hat gesagt.:
foobar hat gesagt.:
Und wie soll diese Trennung funktionieren, wenn das ganze Programm aus nur einer Klasse besteht, die von JFrame abgeleitet ist?
Achso meinst du das. Naja ein Programm das aus einer Klasse besteht kann man auch nicht erstnehmen. Ausser es ist ein ProofOfConcept oder ähnliches.

Ich teile das meistens in Starter und MainFrame auf. Der Starter hat eine Main-Methode und initialisert die Anwendung und der MainFrame baut die GUI aus den einzelnen Teilen zusammen.

's wird Zeit für JSR 296 ;)

Das klingt sehr interessant.
 

André Uhres

Top Contributor
foobar hat gesagt.:
AlArenal hat gesagt.:
foobar hat gesagt.:
Und wie soll diese Trennung funktionieren, wenn das ganze Programm aus nur einer Klasse besteht, die von JFrame abgeleitet ist?
Achso meinst du das. Naja ein Programm das aus einer Klasse besteht kann man auch nicht erstnehmen. Ausser es ist ein ProofOfConcept oder ähnliches.

Ich teile das meistens in Starter und MainFrame auf. Der Starter hat eine Main-Methode und initialisert die Anwendung und der MainFrame baut die GUI aus den einzelnen Teilen zusammen.

's wird Zeit für JSR 296 ;)

Das klingt sehr interessant.
Jup. Oder Experiment 336 :D
 

Leroy42

Top Contributor
AlArenal hat gesagt.:
Wirths Schöpfungen haben mich irgendwie nicht wirklich überzeugt... obowhl der P-Code durchaus Vorläufer der VM von Smalltalk sein könnte...

Hatte der P-Code überhaupt irgend etwas mit mit Wirth zu tun? :shock:

Soweit ich weiß, wurde der nur im UCSD-Pascal (University of California San Diego) eingeführt/verwendet.

P.S.
Ach waren das Zeiten als es für den Apple IIe ein UCSD-Pascal auf 2 Disketten gab.

Verschieden Techniken wie Chaining und gemeinsam genutzter Speicher
ermöglichten damals auf dem kleinen Apple richtig große Anwendungen
zu verwirklichen...

*seufzz*
 

byte

Top Contributor
AlArenal hat gesagt.:
Wobei ich bei Schweizern vorsichtig bin.. Wirths Schöpfungen haben mich irgendwie nicht wirklich überzeugt... obowhl der P-Code durchaus Vorläufer der VM von Smalltalk sein könnte...

Aber sein Buch ist halt immernoch *die* Referenz in Sachen Designpatterns. Auch wenn die deutsche Übersetzung teilweise ein bißchen gruselig ist... ;)
 

Redfrettchen

Bekanntes Mitglied
Was ist denn der konkrete Gegenvorschlag zum Weg
Code:
public static void main(String[] args) {
    new MyJFrame();
}
?

Code:
public static void main(String[] args) {
    JFrame mainFrame = new JFrame();
    mainFrame.add(new JButton("Button"));
    // etc.
oder wie?
 

AlArenal

Top Contributor
@Redfrettchen:

Das sind die beiden Möglichkeiten. Ob man lieber JFrame erweitert, oder nicht, ist auch ne etwas philosophische Frage und hängt u.a. davon ab, ob man eine Komponenten entwickeln möchte, die wiederum beerbt werden können soll. Mitunter findet man nämlich von den einschlägig bekannten Gurus den Hinweis, dass zu oft unnötiger-/unsinnigerweise mit Vererbung gearbeitet wird (schreibe ich in diesem Fall u.a. mal Josh Bloch zu).
 

Redfrettchen

Bekanntes Mitglied
Bei dem zweiten wüsste ich nämlich nicht, wo ich meine GUI-Bestandteile hinpacken sollte. Wenn man jetzt eine eigene Klasse schreibt, die in ihrem Konstruktor die Anwendung zusammenbaut, ruft man ja in der main sowieso nur den Konstruktor dieser Klasse auf. Gut, man spart eine Vererbung, aber dieses "Anwendungsstartobjekt" hat ja danach nur noch eine Speicherfunktion für meine Komponenten. Ist das sinnvoller? Oder denke ich in die falsche Richtung?
 

AlArenal

Top Contributor
Persönlich bin ich da bisher auch immer mehr ein "Vererber" gewesen, wenn es nicht gerade darum ging mal was durchzutesten, alleine schon um den Code aufzuräumen und die Vernatwortlichkeiten klar zu machen. Ist für mich auch intuitiver nachvollziehbar, dass eine von JFrame abgeleitete Klasse sich um den Aufbau des eigenen UIs kümmert, als eine Methode "irgendwo" anders, die Komposition betreibt. Möglicherweise ist es auch diesbezüglich nur ein schlechtes Beispiel und daher irreführend, aber ich habe Blochs "Effective Java" auch nicht zu Hand. Man kann ja nicht jedes Buch sein Eigen nennen.
 

DEvent

Bekanntes Mitglied
Ob man lieber JFrame erweitert, oder nicht, ist auch ne etwas philosophische Frage und hängt u.a. davon ab, ob man eine Komponenten entwickeln möchte, die wiederum beerbt werden können soll.
Man kann auch seine Klasse final machen. Dann kann man von ihr nicht mehr erben.
Code:
public final MyJFrame extends JFrame
{
     public MyJFrame()
     {
          // GUI-Aufbau
     }

    public static void main(String[] args) 
    { 
        new MyJFrame(); 
    }
}
 

byte

Top Contributor
Bei SWT sind die Entwickler sogar so weit gegangen, das Erben von den meisten Widgets bzw. GUI-Komponenten komplett zu verbieten.
 

AlArenal

Top Contributor
Die meisten denken beim Entwickeln nicht daran, was man danach mit dem Code macht, was andere damit machen, .. Was finale Klassen angeht, ist man dann mitten in der Diskussion, ob und wie weit man anderen Nutzern traut. Bloch emfpiehlt alles, was nicht von vornherein auserkoren ist erweitert zu werden, final zu deklarieren und auf Beschwerden und Diskussionen zu warten. Das nachträgliche Entfernen ist ja völlig unkritisch.

Bloch sagt:"So, basically, I think you shouldn't make something extendable unless you have a good reason to do it."
 

AlArenal

Top Contributor
byto hat gesagt.:
Bei SWT sind die Entwickler sogar so weit gegangen, das Erben von den meisten Widgets bzw. GUI-Komponenten komplett zu verbieten.

Habe mich nie mit SWT beschäftigt. Muss man dann alle eigenen Sachen komplett mit beinahe nihcts beginnend aufziehen?
 

byte

Top Contributor
Also ganz alleine in weiter Flur biste auch nicht. Mit JFace (ein Teil der SWT API) stehen einige nützliche Klassen zur Verfügung, die quasi nochmal abstrahieren, ohne dabei aber den Standard SWT Kram zu verstecken. Also bleiben wir mal beim Beispiel eines JFrames in Swing. Das Pendant in SWT wäre eine Shell. Von Shell kannst Du nicht erben. In JFace steht dann ein ApplicationWindow zur Verfügung. Von diesem kann man (ausnahmsweise) auch erben und entsprechende Methoden geeignet überschreiben, die zum Erzeugen von Standard Fensterkram wie Menü, Toolbar, Coolbars, Statusbar sowie des eigentlichen Contents zuständig sind. Du überschreibst die Methoden also und die werden dann automatisch beim Erzeugen des Fensters invoket und intern eine Shell erzeugt mit allem nötigen Brimbramborium. ;)
 

lordpatman

Mitglied
haber mein programm mal ein bisschen überarbeitet, bin auf Actions umgestiegen. habe aber noch ein paar fragen. wie kann ich bei einer Action ein Mnemonic setzen, habe es so probiert:
Code:
newAct.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_N);
hat aber nicht funktioniert.
außerdem möchte ich wissen, wie ich beim textarea, nur den marjierten bereich mit meiner copy-methode kopieren kann.

der neue code:


Code:
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import javax.swing.filechooser.FileFilter; 

public class MainFrame extends JFrame
{
  private Action newAct;
  private Action openAct;
  private Action saveAct;
  private Action saveAsAct;
  private Action quitAct;
  private Action cutAct;
  private Action copyAct;
  private Action pasteAct;
  private Action aboutAct;
  private File file;
  private JLabel statusLabel;
  private JMenu fileMenu;
  private JMenu editMenu;
  private JMenu helpMenu;
  private JMenuBar menuBar;
  private JScrollPane scrollPane;
  private JTextArea textArea;
  
  public MainFrame()
  {
    setTitle("Unbenannt - jEdit-Lite");
    setSize(450, 350);
    setIconImage(new ImageIcon(getClass().getResource("images/txt.png")).getImage()); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
  
    createActions();
    createMenus();
    
    textArea = new JTextArea();
    scrollPane = new JScrollPane(textArea);
    
    statusLabel = new JLabel();
    statusLabel.setText("Bereit");

    add(createToolBar(), BorderLayout.NORTH);
    add(scrollPane, BorderLayout.CENTER);
    add(statusLabel, BorderLayout.SOUTH);
    
    file = null;
    
    setVisible(true);
  }
  
  private void createActions()
  {
    newAct = new AbstractAction("Neu", new ImageIcon("images/new.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         newFile();
      }
    };
    //newAct.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_N);
    newAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
    newAct.putValue(Action.SHORT_DESCRIPTION, "Neu");
    
    openAct = new AbstractAction("Öffnen", new ImageIcon("images/open.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         open();
      }
    };
    openAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
    openAct.putValue(Action.SHORT_DESCRIPTION, "Öffnen");
    
    saveAct = new AbstractAction("Speichern", new ImageIcon("images/save.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         save();
      }
    };
    saveAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
    saveAct.putValue(Action.SHORT_DESCRIPTION, "Speichern");
    
    saveAsAct = new AbstractAction("Speichern unter ...", new ImageIcon("images/saveas.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         saveAs();
      }
    };
    saveAsAct.putValue(Action.SHORT_DESCRIPTION, "Speichern unter");
    
    quitAct = new AbstractAction("Beenden", new ImageIcon("images/exit.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         quit();
      }
    };
    quitAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
    quitAct.putValue(Action.SHORT_DESCRIPTION, "Beenden");
    
    cutAct = new AbstractAction("Auuschneiden", new ImageIcon("images/cut.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         cut();
      }
    };
    cutAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
    cutAct.putValue(Action.SHORT_DESCRIPTION, "Ausschneiden");
    
    copyAct = new AbstractAction("Kopieren", new ImageIcon("images/copy.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         copy();
      }
    };
    copyAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
    copyAct.putValue(Action.SHORT_DESCRIPTION, "Kopieren");
    
    pasteAct = new AbstractAction("Einfügen", new ImageIcon("images/paste.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         paste();
      }
    };
    pasteAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
    pasteAct.putValue(Action.SHORT_DESCRIPTION, "Einfügen");
    
    aboutAct = new AbstractAction("Über", new ImageIcon("images/about.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         about();
      }
    };
    aboutAct.putValue(Action.SHORT_DESCRIPTION, "Über");
  }
  
  private void createMenus()
  {
    menuBar = new JMenuBar();
    
    // file-menu
    fileMenu = new JMenu("Datei");
    fileMenu.setMnemonic(KeyEvent.VK_D);
    fileMenu.add(newAct);
    fileMenu.addSeparator();
    fileMenu.add(openAct);
    fileMenu.addSeparator();
    fileMenu.add(saveAct);
    fileMenu.add(saveAsAct);
    fileMenu.addSeparator();
    fileMenu.add(quitAct);
    
    menuBar.add(fileMenu);
    
    // edit-menu
    editMenu = new JMenu("Bearbeiten");
    editMenu.setMnemonic(KeyEvent.VK_B);
    editMenu.add(cutAct);
    editMenu.add(copyAct);
    editMenu.add(pasteAct);
    
    menuBar.add(editMenu);
    
    // help-menu
    helpMenu = new JMenu("Hilfe");
    helpMenu.setMnemonic(KeyEvent.VK_H);
    helpMenu.add(aboutAct);
    
    menuBar.add(helpMenu);
    
    setJMenuBar(menuBar);
  }
  
  private JToolBar createToolBar()
  {
    JToolBar toolBar = new JToolBar("Tool bar");
    toolBar.add(newAct);
    toolBar.add(openAct);
    toolBar.addSeparator();
    toolBar.add(saveAct);
    toolBar.add(saveAsAct);
    toolBar.addSeparator();
    toolBar.add(cutAct);
    toolBar.add(copyAct);
    toolBar.add(pasteAct);
    
    return toolBar;
  }

 private void newFile()
   {
     file = null;
     textArea.setText("");
     statusLabel.setText("Bereit");
     setTitle("Unbenannt - jEdit-Lite");
   }
   
   private void open()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Öffnen");
     fileChooser.addChoosableFileFilter(new FileFilter() 
     {
       public boolean accept(File f)
       {
         if(f.isDirectory())
           return true;
         
         return f.getName().toLowerCase().endsWith(".txt");
       }
       
       public String getDescription()
       {
         return "*.txt";
       }  
     });
     fileChooser.setMultiSelectionEnabled(false);
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showOpenDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedReader reader = new BufferedReader(new FileReader(file));
         String text = "";
         
         while((text = reader.readLine()) != null) 
         {
           textArea.append(text + System.getProperty("line.separator"));
         }
         
         reader.close();
         
         statusLabel.setText(file.getName() + " erfolgreich geöffnet");
         setTitle(file.getName() + " - jEdit-Lite");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Öffnen abgebrochen");
     }
   }
   
   private void save()
   {
     if(file != null)
     {
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       saveAs();
     }
   }
   
   private void saveAs()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Speichern unter ...");
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showSaveDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Speichern abgebrochen");
     }
   }
   
   private void quit()
   {
     if(JOptionPane.showConfirmDialog(this, "Wollen Sie das Programm wirklich beenden?", "Beenden", 
                                      JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)
                                      == JOptionPane.YES_OPTION)
     {
       setVisible(false);
       dispose();
       System.exit(0);
     }
   }
   
   private void cut()
   {
     copy();
     textArea.setText("");
   }
   
   private void copy()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     String text = textArea.getText();
     StringSelection contents = new StringSelection(text);
     
     cb.setContents(contents, null);
   }
   
   private void paste()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     Transferable content = cb.getContents(this);
     
     try
     {
       String text = (String)content.getTransferData(DataFlavor.stringFlavor);
       textArea.append(text);
     }
     catch(Throwable e)
     {
       e.printStackTrace();
     }
   }
   
   private void about()
   {
     JOptionPane.showMessageDialog(this, "jEdit-Lite 0.1");
   }
   
  public static void main(String[] args)
  {
    new MainFrame();
  }
}
 

Redfrettchen

Bekanntes Mitglied
Hi,
die Dokumentation schreibt zu deiner Umstellung:
public JMenuItem add(Action a)
Creates a new menu item attached to the specified Action object and appends it to the end of this menu. As of 1.3, this is no longer the preferred method for adding Actions to a container. Instead it is recommended to configure a control with an action using setAction, and then add that control directly to the Container.
Du kannst also deine Actions beibehalten, aber solltest wieder JMenuItem und JButton einführen, anstatt die Action direkt zu übergeben.
siehe auch hier.

Mnemonics sind nur für die Menükategorien, also Datei, Bearbeiten, Hilfe etc.

Den markierten Text kannst du mit der Methode JTextComponent#getSelectedText() bekommen.
 

lordpatman

Mitglied
danke für die antwort. jedoch muss ich sagen, dass mnemonics auch bei den menüeinträgen funktionieren, hatte sie nämlich vorher mit den jmenuitems verwendet.
 

Redfrettchen

Bekanntes Mitglied
Naja, das ist doch perfekt, du führst die JMenuItems wieder ein und kannst dann Mnemonics setzen. Ich persönlich habe die noch nie benutzt, um ehrlich zu sein, deshalb auch nie programmiert. Aber gut zu wissen ;)
 

lordpatman

Mitglied
habe aber auch herausgefunden, wie es mit den actions geht. man muss einfach
Code:
newAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
schreiben.
 

lordpatman

Mitglied
habe ein neues problem. ich wollte mit hilfe von eclipse ein .jar aus meinen editor machen, jedoch funktioniert dies nicht. ebenfalls aus der konsole heraus funktioniert es nicht. bekomme unter eclipse nur diese meldungen:

exported with compile warnings: jPad/MainFrame.java
exported with compile warnings: jPad/LineNumber.java

wenn ich es einfach so ausführe funktioniert das programm ohne probleme und startet. darüber hinaus möchte ich gerne noch wissen, wie ich verhindern kann, dass das fenster geschlossen wird wenn man auf "X" drückt. hatte es mit dem windowclosingEvent probiert, doch es hat nicht funktioniert. es hat meine quit-methode aufgerufen, doch wenn man nein gedrückt hat schloss sich das fenster trotzem, mit hilfe des menüeitrags beenden funktioniert die methode. außerdem, wie kann ich beim öffnen einer datei verhindern, dass jedes mal in der letzten zeile noch ein \n kommt, oder muss ich das dann manuel im code wieder entfernen?

hier der sourcecode von den beiden anscheinend fehlerhaften dateien:

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class MainFrame extends JFrame
{
  private Action newAct;
  private Action openAct;
  private Action saveAct;
  private Action saveAsAct;
  private Action quitAct;
  private Action cutAct;
  private Action copyAct;
  private Action pasteAct;
  private Action selectAllAct;
  private Action aboutAct;
  private File file;
  private JLabel statusLabel;
  private JMenu fileMenu;
  private JMenu editMenu;
  private JMenu helpMenu;
  private JMenuBar menuBar;
  private JScrollPane scrollPane;
  private JTextArea textArea;
  
  public MainFrame()
  {
    setTitle("Unbenannt - jPad-Lite");
    setSize(460, 360);
    //Toolkit tool = this.getToolkit();
    //Image image = tool.getImage("images/txt.png");
    setIconImage(new ImageIcon(getClass().getResource("images/txt.png")).getImage()); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //setUndecorated(true);
    setLayout(new BorderLayout());
    /*addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        quit();
      }
    });*/
  
    createActions();
    createMenus();
    
    textArea = new JTextArea();
    scrollPane = new JScrollPane(textArea);
    scrollPane.setRowHeaderView(new LineNumber(textArea)); 
    
    statusLabel = new JLabel();
    statusLabel.setText("Bereit");

    add(createToolBar(), BorderLayout.NORTH);
    add(scrollPane, BorderLayout.CENTER);
    add(statusLabel, BorderLayout.SOUTH);
    
    file = null;
    
    setVisible(true);
  }
  
  private void createActions()
  {
    newAct = new AbstractAction("Neu", new ImageIcon("images/new.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         newFile();
      }
    };
    newAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
    newAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
    newAct.putValue(Action.SHORT_DESCRIPTION, "Neu");
    
    openAct = new AbstractAction("Öffnen", new ImageIcon("images/open.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         open();
      }
    };
    openAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
    openAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
    openAct.putValue(Action.SHORT_DESCRIPTION, "Öffnen");
    
    saveAct = new AbstractAction("Speichern", new ImageIcon("images/save.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         save();
      }
    };
    saveAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
    saveAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
    saveAct.putValue(Action.SHORT_DESCRIPTION, "Speichern");
    
    saveAsAct = new AbstractAction("Speichern unter ...", new ImageIcon("images/saveas.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         saveAs();
      }
    };
    saveAsAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_U));
    saveAsAct.putValue(Action.SHORT_DESCRIPTION, "Speichern unter");
    
    quitAct = new AbstractAction("Beenden", new ImageIcon("images/exit.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         quit();
      }
    };
    quitAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E));
    quitAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
    quitAct.putValue(Action.SHORT_DESCRIPTION, "Beenden");
    
    cutAct = new AbstractAction("Auuschneiden", new ImageIcon("images/cut.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.cut();
      }
    };
    cutAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_A));
    cutAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
    cutAct.putValue(Action.SHORT_DESCRIPTION, "Ausschneiden");
    
    copyAct = new AbstractAction("Kopieren", new ImageIcon("images/copy.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.copy();
      }
    };
    copyAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_K));
    copyAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
    copyAct.putValue(Action.SHORT_DESCRIPTION, "Kopieren");
    
    pasteAct = new AbstractAction("Einfügen", new ImageIcon("images/paste.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.paste();
      }
    };
    pasteAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
    pasteAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
    pasteAct.putValue(Action.SHORT_DESCRIPTION, "Einfügen");
    
    selectAllAct = new AbstractAction("Alles auswählen") 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.selectAll();
      }
    };
    selectAllAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_L));
    selectAllAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
    selectAllAct.putValue(Action.SHORT_DESCRIPTION, "Alles auswählen");
    
    aboutAct = new AbstractAction("Über", new ImageIcon("images/about.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         about();
      }
    };
    aboutAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B));
    aboutAct.putValue(Action.SHORT_DESCRIPTION, "Über");
  }
  
  private void createMenus()
  {
    menuBar = new JMenuBar();
    
    // file-menu
    fileMenu = new JMenu("Datei");
    fileMenu.setMnemonic(KeyEvent.VK_D);
    fileMenu.add(newAct);
    fileMenu.addSeparator();
    fileMenu.add(openAct);
    fileMenu.addSeparator();
    fileMenu.add(saveAct);
    fileMenu.add(saveAsAct);
    fileMenu.addSeparator();
    fileMenu.add(quitAct);
    
    menuBar.add(fileMenu);
    
    // edit-menu
    editMenu = new JMenu("Bearbeiten");
    editMenu.setMnemonic(KeyEvent.VK_B);
    editMenu.add(cutAct);
    editMenu.add(copyAct);
    editMenu.add(pasteAct);
    editMenu.addSeparator();
    editMenu.add(selectAllAct);
    
    menuBar.add(editMenu);
    
    // help-menu
    helpMenu = new JMenu("Hilfe");
    helpMenu.setMnemonic(KeyEvent.VK_H);
    helpMenu.add(aboutAct);
    
    menuBar.add(helpMenu);
    
    setJMenuBar(menuBar);
  }
  
  private JToolBar createToolBar()
  {
    JToolBar toolBar = new JToolBar("Tool bar");
    toolBar.add(newAct);
    toolBar.add(openAct);
    toolBar.addSeparator();
    toolBar.add(saveAct);
    toolBar.add(saveAsAct);
    toolBar.addSeparator();
    toolBar.add(cutAct);
    toolBar.add(copyAct);
    toolBar.add(pasteAct);
    
    return toolBar;
  }
  
  private void newFile()
   {
     file = null;
     textArea.setText("");
     statusLabel.setText("Bereit");
     setTitle("Unbenannt - jPad-Lite");
   }
   
   private void open()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Öffnen");
     fileChooser.addChoosableFileFilter(new TextFileFilter()); 
     fileChooser.setMultiSelectionEnabled(false);
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showOpenDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedReader reader = new BufferedReader(new FileReader(file));
         String text = "";
         
         while((text = reader.readLine()) != null) 
         {
           textArea.append(text + System.getProperty("line.separator"));
         }
         
         reader.close();
         
         statusLabel.setText(file.getName() + " erfolgreich geöffnet");
         setTitle(file.getName() + " - jPad-Lite");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Öffnen abgebrochen");
     }
   }
   
   private void save()
   {
     if(file != null)
     {
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       saveAs();
     }
   }
   
   private void saveAs()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Speichern unter ...");
     fileChooser.addChoosableFileFilter(new TextFileFilter()); 
     fileChooser.setMultiSelectionEnabled(false);
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showSaveDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Speichern abgebrochen");
     }
   }
   
   private void quit()
   {
     if(JOptionPane.showConfirmDialog(this, "Wollen Sie das Programm wirklich beenden?", "Beenden", 
                                      JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)
                                      == JOptionPane.YES_OPTION)
     {
       setVisible(false);
       dispose();
       System.exit(0);
     }
   }
   
   /*private void cut()
   {
     copy();
     textArea.setText("");
   }
   
   private void copy()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     String text = textArea.getText();
     StringSelection contents = new StringSelection(text);
     
     cb.setContents(contents, null);
   }
   
   private void paste()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     Transferable content = cb.getContents(this);
     
     try
     {
       String text = (String)content.getTransferData(DataFlavor.stringFlavor);
       textArea.append(text);
     }
     catch(Throwable e)
     {
       e.printStackTrace();
     }
   }*/
   
   private void about()
   {
     JOptionPane.showMessageDialog(this, "jPad-Lite 0.1");
   }
}

Code:
import java.awt.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.*;

public class LineNumber extends JComponent
{
  private final static Color DEFAULT_BACKGROUND = new Color(180, 180, 180);
  private final static Color DEFAULT_FOREGROUND = Color.black;
  private final static Font  DEFAULT_FONT = new Font("monospaced", Font.PLAIN, 12);

  // LineNumber height (abends when I use MAX_VALUE)
  private final static int HEIGHT = Integer.MAX_VALUE - 1000000;

  // Set right/left margin
  private final static int MARGIN = 5;

  // Variables for this LineNumber component
  private FontMetrics fontMetrics;
  private int lineHeight;
  private int currentDigits;

  // Metrics of the component used in the constructor
  private JComponent component;
  private int componentFontHeight;
  private int componentFontAscent;

  /**
   *Convenience constructor for Text Components
   */
  public LineNumber(JComponent component)
  {
    if(component == null)
    {
      setFont(DEFAULT_FONT);
      this.component = this;
    }
    else
    {
      setFont(component.getFont());
      this.component = component;
    }

    setBackground(DEFAULT_BACKGROUND);
    setForeground(DEFAULT_FOREGROUND);
    setPreferredWidth(99);
  }

  /**
   *  Calculate the width needed to display the maximum line number
   */
  public void setPreferredWidth(int lines)
  {
    int digits = String.valueOf(lines).length();

    // Update sizes when number of digits in the line number changes

    if(digits != currentDigits && digits > 1)
    {
      currentDigits = digits;
      int width = fontMetrics.charWidth('0') * digits;
      Dimension d = getPreferredSize();
      d.setSize(2 * MARGIN + width, HEIGHT);
      setPreferredSize(d);
      setSize(d);
    }
  }

  /**
   *  Reset variables that are dependent on the font.
   */
  public void setFont(Font font)
  {
    super.setFont(font);
    fontMetrics = getFontMetrics(getFont());
    componentFontHeight = fontMetrics.getHeight();
    componentFontAscent = fontMetrics.getAscent();
  }

  /**
   *  The line height defaults to the line height of the font for this
   *  component.
   */
  public int getLineHeight()
  {
    if(lineHeight == 0)
      return componentFontHeight;
    else
      return lineHeight;
  }

  /**
   *  Override the default line height with a positive value.
   *  For example, when you want line numbers for a JTable you could
   *  use the JTable row height.
   */
  public void setLineHeight(int lineHeight)
  {
    if(lineHeight > 0)
      this.lineHeight = lineHeight;
  }

  public int getStartOffset()
  {
    return component.getInsets().top + componentFontAscent;
  }

  public void paintComponent(Graphics g)
  {
    int lineHeight = getLineHeight();
    int startOffset = getStartOffset();
    Rectangle drawHere = g.getClipBounds();
    
    // Paint the background

    g.setColor(getBackground());
    g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);

    // Determine the number of lines to draw in the foreground.

    g.setColor(getForeground());
    int startLineNumber = (drawHere.y / lineHeight) + 1;
    int endLineNumber = startLineNumber + (drawHere.height / lineHeight);

    int start = (drawHere.y / lineHeight) * lineHeight + startOffset;

    for(int i = startLineNumber; i <= endLineNumber; i++)
    {
      String lineNumber = String.valueOf(i);
      int stringWidth = fontMetrics.stringWidth(lineNumber);
      int rowWidth = getSize().width;
      g.drawString(lineNumber, rowWidth - stringWidth - MARGIN, start);
      start += lineHeight;
    }

    int rows = component.getSize().height / componentFontHeight;
    setPreferredWidth(rows);
  }
}
 

Redfrettchen

Bekanntes Mitglied
1. Wieso hört mir keiner zu, wenn ich was sage? Da oben in meinem Post habe ich zwar zitiert, dass empfohlen wird, nicht direkt die Actions zu übergeben, aber bitte, es soll mein Problem nicht sein...
2. Compile warnings sind eigentlich egal. Aber wenn du es wissen willst, in LineNumber importierst du unnötigerweise javax.swing.text.* und javax.swing.border.*. Sonst wird er wahrscheinlich rummeckern wegen einer fehlenden serialVersionUID, aber das kann man eigentlich auch ignorieren.
3. Du benutzt in Zeile 35 in MainFrame
Code:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
. Wenn du das Beenden selbst in die Hand nehmen willst, dann musst du im WindowListener windowClosing(WindowEvent) implementieren, sieh auch Java ist auch eine Insel zu dem Thema.
4. Ich glaube du musst das manuell entfernen.
 

lordpatman

Mitglied
aber trotz dieser warnings will das .jar nicht funktionieren. und ich hatte vorher die setDefaultCloseOperation entfernt und das mit dem windowClosingEvent gemacht gehabt, das fenster hatte sich aber trotzdem geschlossen, obwohl man im confirm-dialog auf den nein-button gedrückt hatte.
zu den actions, ich frage mich warum diese variante veraltet sein soll, ich finde es wesentlich einfache und übersichtlicher und es ist nicht so ein unnötiges doppeln von sachen. aber wenn es veraltet ist, werde ich mein programm mal umstellen.
 

Redfrettchen

Bekanntes Mitglied
Du musst doch da nix doppeln oO
Code:
// statt filemenu.add(actionSoUndSo);
filemenu.add(new JMenuItem(actionSoUndSo));

In Eclipse musst du dir beim Exportieren nach JAR mal den ganzen Dialog durchlesen, also eigentlich nach dem auswählen des Projekts zweimal auf Next> gehen. Da steht dann da unten Main Class und ein TextField, wo du die Klasse auswählen musst, die die main-Methode enthält.

Und wegen dem Schließen: Dann versuch doch einfach mal setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); und implementier dann im WindowListener/WindowAdapter windowClosing(WindowEvent) nach deinem Geschmack (vermutlich einfach quit() aufrufen in diesem Fall)).
 

lordpatman

Mitglied
so habe den code nun geändert. das mit dem windowClosingEvent funktioniert jedoch nicht, wie ich schon bereits gesagt hatte, habe es wieder in meinem code. wenn man im confirm-dialog nein drückt schließt sich das fenster trotzdem, aber die selbe methode über den menüpunkt aufegrufen funktioniert. ebenfalls das jar will nicht laufen, habe alle einstellungen richtig vorgenommen, main-class etc. ausgewählt. aber irgendwie ist das jar immer kaputt. ausgabe wenn ich es starten will: Invalid or corrupt jarfile jPad-0.1.jar. ich habe auch immer noch die warnungen.

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class MainFrame extends JFrame
{
  private Action newAct;
  private Action openAct;
  private Action saveAct;
  private Action saveAsAct;
  private Action quitAct;
  private Action cutAct;
  private Action copyAct;
  private Action pasteAct;
  private Action selectAllAct;
  private Action aboutAct;
  private File file;
  private JLabel statusLabel;
  private JMenu fileMenu;
  private JMenu editMenu;
  private JMenu helpMenu;
  private JMenuBar menuBar;
  private JScrollPane scrollPane;
  private JTextArea textArea;
  
  public MainFrame()
  {
    setTitle("Unbenannt - jPad-Lite");
    setSize(460, 360);
    setIconImage(new ImageIcon(getClass().getResource("images/txt.png")).getImage()); 
    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        quit();
      }
    });
  
    createActions();
    setJMenuBar(createMenuBar());
    
    textArea = new JTextArea();
    //textArea.setLineWrap(true);
    scrollPane = new JScrollPane(textArea);
    scrollPane.setRowHeaderView(new LineNumber(textArea)); 
    
    statusLabel = new JLabel();
    statusLabel.setText("Bereit");

    add(createToolBar(), BorderLayout.NORTH);
    add(scrollPane, BorderLayout.CENTER);
    add(statusLabel, BorderLayout.SOUTH);
    
    file = null;
    
    setVisible(true);
  }
  
  private void createActions()
  {
    newAct = new AbstractAction("Neu", new ImageIcon("images/new.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         newFile();
      }
    };
    newAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
    newAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
    newAct.putValue(Action.SHORT_DESCRIPTION, "Neu");
    
    openAct = new AbstractAction("Öffnen", new ImageIcon("images/open.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         open();
      }
    };
    openAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
    openAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
    openAct.putValue(Action.SHORT_DESCRIPTION, "Öffnen");
    
    saveAct = new AbstractAction("Speichern", new ImageIcon("images/save.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         save();
      }
    };
    saveAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
    saveAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
    saveAct.putValue(Action.SHORT_DESCRIPTION, "Speichern");
    
    saveAsAct = new AbstractAction("Speichern unter ...", new ImageIcon("images/saveas.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         saveAs();
      }
    };
    saveAsAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_U));
    saveAsAct.putValue(Action.SHORT_DESCRIPTION, "Speichern unter");
    
    quitAct = new AbstractAction("Beenden", new ImageIcon("images/exit.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         quit();
      }
    };
    quitAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E));
    quitAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
    quitAct.putValue(Action.SHORT_DESCRIPTION, "Beenden");
    
    cutAct = new AbstractAction("Ausschneiden", new ImageIcon("images/cut.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.cut();
      }
    };
    cutAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_A));
    cutAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
    cutAct.putValue(Action.SHORT_DESCRIPTION, "Ausschneiden");
    
    copyAct = new AbstractAction("Kopieren", new ImageIcon("images/copy.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.copy();
      }
    };
    copyAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_K));
    copyAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
    copyAct.putValue(Action.SHORT_DESCRIPTION, "Kopieren");
    
    pasteAct = new AbstractAction("Einfügen", new ImageIcon("images/paste.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.paste();
      }
    };
    pasteAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
    pasteAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
    pasteAct.putValue(Action.SHORT_DESCRIPTION, "Einfügen");
    
    selectAllAct = new AbstractAction("Alles auswählen") 
    {
      public void actionPerformed(ActionEvent e)
      {
         textArea.selectAll();
      }
    };
    selectAllAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_L));
    selectAllAct.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
    selectAllAct.putValue(Action.SHORT_DESCRIPTION, "Alles auswählen");
    
    aboutAct = new AbstractAction("Über", new ImageIcon("images/about.png")) 
    {
      public void actionPerformed(ActionEvent e)
      {
         about();
      }
    };
    aboutAct.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B));
    aboutAct.putValue(Action.SHORT_DESCRIPTION, "Über");
  }
  
  private JMenuBar createMenuBar()
  {
    menuBar = new JMenuBar();
    
    // file-menu
    fileMenu = new JMenu("Datei");
    fileMenu.setMnemonic(KeyEvent.VK_D);
    fileMenu.add(new JMenuItem(newAct));
    fileMenu.addSeparator();
    fileMenu.add(new JMenuItem(openAct));
    fileMenu.addSeparator();
    fileMenu.add(new JMenuItem(saveAct));
    fileMenu.add(new JMenuItem(saveAsAct));
    fileMenu.addSeparator();
    fileMenu.add(new JMenuItem(quitAct));
    
    menuBar.add(fileMenu);
    
    // edit-menu
    editMenu = new JMenu("Bearbeiten");
    editMenu.setMnemonic(KeyEvent.VK_B);
    editMenu.add(new JMenuItem(cutAct));
    editMenu.add(new JMenuItem(copyAct));
    editMenu.add(new JMenuItem(pasteAct));
    editMenu.addSeparator();
    editMenu.add(new JMenuItem(selectAllAct));
    
    menuBar.add(editMenu);
    
    // help-menu
    helpMenu = new JMenu("Hilfe");
    helpMenu.setMnemonic(KeyEvent.VK_H);
    helpMenu.add(new JMenuItem(aboutAct));
    
    menuBar.add(helpMenu);
    
    return menuBar;
  }
  
  private JToolBar createToolBar()
  {
    JToolBar toolBar = new JToolBar("Tool bar");
    
    JButton newButton = new JButton();
    newButton.setAction(newAct);
    newButton.setText("");
    toolBar.add(newButton);
    
    JButton openButton = new JButton();
    openButton.setAction(openAct);
    openButton.setText("");
    toolBar.add(openButton);
    
    toolBar.addSeparator();
    
    JButton saveButton = new JButton();
    saveButton.setAction(saveAct);
    saveButton.setText("");
    toolBar.add(saveButton);
    
    JButton saveAsButton = new JButton();
    saveAsButton.setAction(saveAsAct);
    saveAsButton.setText("");
    toolBar.add(saveAsButton);
    
    toolBar.addSeparator();
    
    JButton cutButton = new JButton();
    cutButton.setAction(cutAct);
    cutButton.setText("");
    toolBar.add(cutButton);
    
    JButton copyButton = new JButton();
    copyButton.setAction(copyAct);
    copyButton.setText("");
    toolBar.add(copyButton);
    
    JButton pasteButton = new JButton();
    pasteButton.setAction(pasteAct);
    pasteButton.setText("");
    toolBar.add(pasteButton);
    
    return toolBar;
  }
  
  private void newFile()
   {
     file = null;
     textArea.setText("");
     statusLabel.setText("Bereit");
     setTitle("Unbenannt - jPad-Lite");
   }
   
   private void open()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Öffnen");
     fileChooser.addChoosableFileFilter(new TextFileFilter()); 
     fileChooser.setMultiSelectionEnabled(false);
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showOpenDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedReader reader = new BufferedReader(new FileReader(file));
         String text = "";
         
         while((text = reader.readLine()) != null) 
         {
           textArea.append(text + System.getProperty("line.separator"));
         }
         
         reader.close();
         
         statusLabel.setText(file.getName() + " erfolgreich geöffnet");
         setTitle(file.getName() + " - jPad-Lite");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Öffnen abgebrochen");
     }
   }
   
   private void save()
   {
     if(file != null)
     {
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       saveAs();
     }
   }
   
   private void saveAs()
   {
     JFileChooser fileChooser = new JFileChooser(".");

     // Titel des Dialogs
     fileChooser.setDialogTitle("Speichern unter ...");
     fileChooser.addChoosableFileFilter(new TextFileFilter()); 
     fileChooser.setMultiSelectionEnabled(false);
       
     // Wenn OK gedrueckt wurde, fuehre aus...
     int ret = fileChooser.showSaveDialog(this);
     
     if(ret == JFileChooser.APPROVE_OPTION) 
     {
       // der OK-Button des FileChooser-Dialogs wurde gedrueckt
       file = fileChooser.getSelectedFile();
       
       try 
       {
         BufferedWriter writer = new BufferedWriter(new FileWriter(file));
         String text = textArea.getText();
         
         writer.write(text);
         writer.close();
         
         statusLabel.setText(file.getName() + " erfolgreich gespeichert");
       }
       catch(IOException e)
       {
         e.printStackTrace();
       } 
     }
     else
     {
       statusLabel.setText("Speichern abgebrochen");
     }
   }
   
   private void quit()
   {
     if(JOptionPane.showConfirmDialog(this, "Wollen Sie das Programm wirklich beenden?", "Beenden", 
                                      JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)
                                      == JOptionPane.YES_OPTION)
     {
       setVisible(false);
       dispose();
       System.exit(0);
     }
   }
   
   /*private void cut()
   {
     copy();
     textArea.setText("");
   }
   
   private void copy()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     String text = textArea.getText();
     StringSelection contents = new StringSelection(text);
     
     cb.setContents(contents, null);
   }
   
   private void paste()
   {
     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
     Transferable content = cb.getContents(this);
     
     try
     {
       String text = (String)content.getTransferData(DataFlavor.stringFlavor);
       textArea.append(text);
     }
     catch(Throwable e)
     {
       e.printStackTrace();
     }
   }*/
   
   private void about()
   {
     JOptionPane.showMessageDialog(this, "jPad-Lite 0.1");
   }
}
 

Redfrettchen

Bekanntes Mitglied
Jesus Christus noch einmal... Was steht da oben? Ich zitier es einfach nochmal und heb den wichtigen Teil hervor
Redfrettchen hat gesagt.:
Und wegen dem Schließen: Dann versuch doch einfach mal setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); und implementier dann im WindowListener/WindowAdapter windowClosing(WindowEvent) nach deinem Geschmack (vermutlich einfach quit() aufrufen in diesem Fall)).

Weiterhin, ich habe auch schon einmal gesagt, dass die Warnings egal sind. Außerdem müsstest du sie in Eclipse auch sehen können, wenn du die Dateien bearbeitest (gelbe Markierung am rechten Rand, gelbe Schlängellinie unter dem Codestück, dass die Warnung auslöst). Wenn du eine Warnung siehst, kannst du auch versuchen, dass sie nicht mehr angezeigt wird (also entweder in Eclipse ausstellen oder einfach das machen, was Eclipse vorschlägt).

So, und wegen dem JAR. Ich hab das einfach mal selbst probiert (also alles bei mir fehlende, wie das mit dem Icon und diesen FileFilter auskommentiert, das mit dem Schließen gefixt...) und eine JAR Datei erzeugt. Man kann sie starten und alles ist wunderbar. Hier also ausführlichst die Sachen, die ich im Eclipse Dialog angegeben habe:
Export... -> JAR file auswählen
Next > drücken
das Projekt im linken Panel, diesem Projekt-Baum, auswählen (Checkbox aktivieren)
im rechten Panel nichts auswählen
darunter die Optionen:
Export generated class files and resources
(Export java source files and resources) <- nur wenn du auch die .java Dateien im JAR haben willst
auswählen (Checkbox aktivieren)
gewünschtes Ziel auswählen (möglichst mal nen anderen Ordner als sonst versuchen oder immer die alte Datei löschen)
darunter bei Options
Compress the contents of the JAR file
Add directory entries
auswählen (Checkbox aktivieren)
Next > drücken
in diesem Teil nur Export class files with compile warnings
Next > drücken
Generate the manifest file auswählen (RadioButton beim diesem Label auswählen)
Bei Seal some packages (das ausgewählt sein sollte) muss rechts Nothing sealed neben dem Details...-Button stehen
bei Main-Class hab ich einfach mal MainFrame genommen und vorher da die folgende main-Methode eingetragen:
Code:
public static void main(String[] args) {
    new MainFrame();
}
Finish drücken

Mit diesen Einstellungen hat es bei mir funktioniert, über den Sinn und Unsinn einiger Optionen kann man sich streiten, aber sonst ist es ersteinmal egal.[/b]
 

lordpatman

Mitglied
vielen, vielen dank für deine hilfe. möchte mich auch mal entschuldigen, wenn ich ein bisschen zu viel genervt habe oder mich dumm angestellt habe, danke. zum jar-file, ich hatte es genauso gemacht, selbst nach deiner anleitung hatte es nicht geklappt. erst als ich eine komplett anderen ordner als speicherort genommen hatte, obwohl ich das falsche jar-file voherimmer wieder gelöscht hatte, komisch. aber nun funktioniert es ja endlich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
M Suche Resteasy Example Java Basics - Anfänger-Themen 24
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
M binäre Suche im Intervall Java Basics - Anfänger-Themen 6
M binäre Suche Java Basics - Anfänger-Themen 4
H Suche Java3D 32 bit Java Basics - Anfänger-Themen 20
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
RudiRüssel Binäre Suche, unsortiert, lokales Maximum Java Basics - Anfänger-Themen 15
Y Suche von Studenten anhand Ihrer Eigenschaften. Java Basics - Anfänger-Themen 1
F Auf der Suche in π Java Basics - Anfänger-Themen 13
C Suche Nachhilfe in Java Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A suche dringend Hilfe!! Java Basics - Anfänger-Themen 6
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Suche free SVN Hosting Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
S Java Lineare Suche Java Basics - Anfänger-Themen 1
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
B Suche Programme mit Fehlern Java Basics - Anfänger-Themen 9
jaleda100 Component für Suche Java Basics - Anfänger-Themen 4
L Suche ein sampel Projekt Java Basics - Anfänger-Themen 2
P Suche Aufwandsgenerator (o-notation) Java Basics - Anfänger-Themen 1
S Suche aktuelles 2D Grafik Tutorial Java Basics - Anfänger-Themen 5
M Suche hilfe bei Array Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
D Ich suche nach einer Möglickeit den Webseiten Inhalt per Java zu analysieren Automatisch Java Basics - Anfänger-Themen 3
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
D Erste Schritte Suche Quelltext Java Basics - Anfänger-Themen 7
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Suche Hilfestellung Java Basics - Anfänger-Themen 10
G Erste Schritte Suche Java Programmierer für kleines Projekt Java Basics - Anfänger-Themen 1
J Suche die Emailadresse Java Basics - Anfänger-Themen 6
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
H Erste Schritte Binäre Suche Java Basics - Anfänger-Themen 37
J Suche simples Beispiel für die EOFException Java Basics - Anfänger-Themen 1
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
L Binäre Suche Java Basics - Anfänger-Themen 2
L Linerae Suche in einem sortierten Array Java Basics - Anfänger-Themen 2
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
J Binäre Suche eines Array Java Basics - Anfänger-Themen 5
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
M Benutzerdefinierte Suche in einem String - outofbounds Java Basics - Anfänger-Themen 7
X Best Practice SUCHE ein gutes Javabuch! (kein Anfang von 0) Java Basics - Anfänger-Themen 5
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
S Suche richtigen Typ für Variabel mit den Werten (neu, gebraucht, beschädigt) Java Basics - Anfänger-Themen 7
M Best Practice Programmierstil Graphen-A*-Suche Java Basics - Anfänger-Themen 5
M Suche Hilfe bei sehr kleinen Quelltexten Java Basics - Anfänger-Themen 2
E Suche Klasse die eine Bedinung prüft und einen von zwei Auswahlwerten zurückgibt... Java Basics - Anfänger-Themen 6
D Erste Schritte suche hilfe für db-anbindung Java Basics - Anfänger-Themen 36
S Java Servlet - Suche Java Basics - Anfänger-Themen 1
P Hashing suche Java Basics - Anfänger-Themen 4
K Suche Hilfe bei einfachem Java Code ( Debuggen ) Java Basics - Anfänger-Themen 1
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Binäre Suche Fehler überall =( Java Basics - Anfänger-Themen 2
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0
D Binärbaum Suche Java Basics - Anfänger-Themen 5
U Vererbung Suche Hilfe anhand eines Bsp. Java Basics - Anfänger-Themen 1
L Suche Programmier-Projekt mit Anleitung Java Basics - Anfänger-Themen 3
A Suche Programmierer für Android App Java Basics - Anfänger-Themen 1
H Suche Vergleichstabelle für die Klassen String und StringBuilder Java Basics - Anfänger-Themen 1
X [SUCHE]Mitentwickler Java Basics - Anfänger-Themen 10
P Methoden suche funktion die char wert ausgibt wenn man numerischen wert und radix angibt Java Basics - Anfänger-Themen 1
D Binare Suche Java Basics - Anfänger-Themen 1
C Erste Schritte Bereich angeben bzw Fehler Suche Java Basics - Anfänger-Themen 6
L Suche in dreidimensionalen Arrays Java Basics - Anfänger-Themen 3
P Lineare Suche im Array Java Basics - Anfänger-Themen 5
X verschachtelte suche Java Basics - Anfänger-Themen 8
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
S Erste Schritte Suche nach einem guten JAVA-Buch (Definition im Thread) Java Basics - Anfänger-Themen 6
G suche den Begriff & wie programmiere ich sowas (ich ändere den Titel dann) Java Basics - Anfänger-Themen 2
M suche/brauche Links über rein GUI Beispielprogramme Java Basics - Anfänger-Themen 4
I Suche Component welches Map ähnelt Java Basics - Anfänger-Themen 11
D Binäre Suche für Integerarray in rekursiver Funktion Java Basics - Anfänger-Themen 5
G Erste Schritte Suche nach Zeichenkette Java Basics - Anfänger-Themen 26
steffomio Suche brauchbares I18N Lib Java Basics - Anfänger-Themen 4
J Suche Tipps zum erstellen von Algorithmen Java Basics - Anfänger-Themen 5
D Artikel-Suche implementieren Java Basics - Anfänger-Themen 7
S suche nach eclipse plug-in Java Basics - Anfänger-Themen 3
W Compiler-Fehler Binäre Suche Java Basics - Anfänger-Themen 2
R Suche Regex Ausdruck für HTML Java Basics - Anfänger-Themen 11
K Suche geeignete Code-Beispiele Java Basics - Anfänger-Themen 4
P Suche Java Programme mit gutem/anfängertauglichem Quellcode Java Basics - Anfänger-Themen 8
I Suche Compiler in Java SDK Java Basics - Anfänger-Themen 5
R String in Strig Suche Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben