Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

JScrollPane pomoc

[es] :: Java :: JScrollPane pomoc

Strane: 1 2

[ Pregleda: 4414 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon JScrollPane pomoc29.11.2008. u 15:00 - pre 187 meseci
tek sam skoro poceo da se igram sa swingom i sad imam problemcica sa skrolovanjem JTextArea-e. Prvo me zanima mogu li kako da napravim da se skrolbar smanjuje kad unosim sto vise linija teksta? ja sam to rijesio tako sto sam dodao keylistener u textarea i napravio da svaki put povecava broj redova kad pritisnem enter:
Code:
            jTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
                public void keyTyped(java.awt.event.KeyEvent e) {
                    if(e.paramString().contains("Enter")) { 
                        jTextArea.setRows(enter++); //int enter je definisano 
                    }
                }
            });

zanima me je li ovo jedini nacin da se skrolbar smanuje ili postoji neka metoda za to unuat api-a koja to sama radi?

druga stvar: (koju nisam rijesio)
imam textarea koji nije editable, i zanima me mogu li kako da i ovdje napravim skrolbar da je dinamican, tj da se smanjuje ako je to potrebno?
i na kraju, zanima me mogu li kako da napravim da se skrolbar ne vidi dok to nije potrebno? pokusao sam sa scrollbar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); ali je uvijek prikazan :|
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.ptt.rs.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc29.11.2008. u 19:22 - pre 187 meseci
JScrollPane sam vodi računa o tome da se scrollbar smanjuje koliko je potrebno.
Ali neće ti se smanjivati dok tekst u JTextArea ne postane previše veliki da bi se prikazao u polju koje zauzima JScrollPane. Kada bude više teksta nego JScrollPane veličina onda će se skrolovati sve kako treba.

Ne bi bilo loše da pošalješ kod da vidim kako si rešio inicijalizaciju JSrollPane i JTextArea.

Isto i sa JTextArea koja je uneditable. Ako je tekst koji prikazuje van vidljivog polja onda ćeš imati scrollbar.

U tvom primeru
scrollbar.setVerticalScroll...
scrollbar je instanca čega?

Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc30.11.2008. u 04:43 - pre 187 meseci
Code:
    private JTextArea getJTextArea() {
        if (jTextArea == null) {
            jTextArea = new JTextArea();
            jTextArea.setPreferredSize(new Dimension(400, 150));
            jTextArea.setLineWrap(true);
            jTextArea.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jTextArea.setWrapStyleWord(true);
        }
        return jTextArea;
    }


Code:
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new FlowLayout());
            jPanel.add(getJTextArea(), null);
            JScrollPane scrollbar = new JScrollPane(jTextArea);
            scrollbar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollbar.setBorder(BorderFactory.createTitledBorder("Enter Text:"));
            scrollbar.setPreferredSize(new Dimension(400,150));
            jPanel.add(scrollbar);
        }
        return jPanel;
    }

scrollbar je instanca JScrollPane-a. e sa ovakvim kodom samo dobijem veliki scrollbar koji se samo spusti kad pritiskam enter, ne smanjuje se...
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.opera-mini.net.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc30.11.2008. u 17:20 - pre 187 meseci
Je li postoji bar jedan dobar razlog da instancu JScrollPane nazoves scrollBar?
Sad uopste ne mogu da budem siguran da znas razliku izmedu ta dva. Znas li?
Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc30.11.2008. u 20:34 - pre 187 meseci
Znam razliku. Zašto je sad bitno ime instance? Zanemari ga.. Zamisli da piše scrollPane :D
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

interstellar
Umag, Istra

Član broj: 120429
Poruke: 4
*.com
Via: [es] mailing liste



Profil

icon Re: JScrollPane pomoc30.11.2008. u 20:53 - pre 187 meseci
>

:)
 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.ptt.rs.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc01.12.2008. u 16:16 - pre 187 meseci
Pa moram da vidim da li vredi objašnjavati. Rekao si da si tek krenuo sa Swing :)

Sve si ok uradio. Mada mi je skroz diskutabilno zašto dodaješ u panel prvo jtextarea pa onda istu instancu jtextarea dodaš na jscrollpane pa njega u panel?

E sad pošto kod izgleda ok, ili ti očekuješ da vidiš nešto što nije standardno ili negde u ostatku koda imaš nešto što čini da dobijaš rezultat koji ne proizilazi iz prikazanog koda.

Kada napraviš instancu JScrollPane i dodaš na njega JTextArea, ako je area prazna kao što je tvoj slućaj, dobijaš scrollpane sa textarea koja je prazna. Sa strane scrollpane dobiješ scrollbar(verikalni) po default pošto je textarea prazna biće neaktivan. Ako hoćeš da se ne vidi scrollbar kad ne treba postaviš stvari baš ovako kao što si ti.

Ako ti i dalje nije jasno stavi neki screenshot da vidim št adobijaš kao rezultat. Ili okači sve od čega ovaj kod zavisi pa da vidimo u čemu je problem. ;)
Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc03.12.2008. u 09:45 - pre 187 meseci
Citat:
Ivan Ivanic: Sve si ok uradio. Mada mi je skroz diskutabilno zašto dodaješ u panel prvo jtextarea pa onda istu instancu jtextarea dodaš na jscrollpane pa njega u panel?

Na ovo nisam obraćao pažnju. Makao sam jTextArea.add, ali onda kad se doda scrollpane samo stoji kao text editor koji nema vertikalni scrollbar i na njega ne mogu iskucat ništa.. e sad kad prosleđujem argument jtextarea-e kontsruktoru jscrollpane-a, ako proslijedim samo objekat (jTextArea) onda dobijem samo text editor koji sam gore naveo, a ako proslijedim getter (getJTextArea()), onda dobijem isto kao da sam prvo dodao instancu jTextArea, pa onda jScrollPane. Evo ti kod cijelog programa:

Code:
package gui;

import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import java.awt.Point;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import java.awt.Font;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JTextArea;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import javax.swing.JCheckBox;
import javax.swing.JScrollPane;

public class MainWindow {

    private JFrame jFrame = null;  //  @jve:decl-index=0:visual-constraint="10,10"
    private JPanel jContentPane = null;
    private JDialog aboutDialog = null;  //  @jve:decl-index=0:visual-constraint="457,33"
    private JPanel aboutContentPane = null;
    private JLabel aboutVersionLabel = null;
    private JTextArea jTextArea = null;
    private JPanel jPanel = null;
    private JPanel jPanel1 = null;
    private JTextArea jTextArea1 = null;
    private JPanel jPanel2 = null;
    private JButton jButtonTrans = null;
    private JPanel jPanel3 = null;
    private JButton jButtonClip = null;
    private JButton jButtonAbout = null;
    private JButton jButtonExit = null;
    private JPanel jPanel4 = null;
    private JCheckBox jCheckBoxExtraZero = null;
    private JCheckBox jCheckBoxLetters = null;
    private JCheckBox jCheckBoxWords = null;
    private JPanel jPanel5 = null;
    private JLabel jLabel = null;
    private boolean extrazero = true;
    private boolean sepletters = false;
    private boolean sepwords = false;
    private JButton jButton = null;
    private JPanel jPanel6 = null;
    private JButton jButton2 = null;
    private int enter = 1;
    /**
     * This method initializes jFrame
     * 
     * @return javax.swing.JFrame
     */
    public JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jFrame.setSize(430, 516);
            jFrame.setContentPane(getJContentPane());
            jFrame.setTitle("Binary Translator");
            jFrame.setResizable(false);
            try { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch(UnsupportedLookAndFeelException ulfe) { 
                ulfe.printStackTrace();
            } catch(IllegalAccessException iae) { 
                iae.printStackTrace();
            } catch(InstantiationException ie) { 
                ie.printStackTrace();
            } catch(ClassNotFoundException nce) { 
                nce.printStackTrace();
            }
            SwingUtilities.updateComponentTreeUI(jFrame);
        }
        return jFrame;
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getJPanel(), BorderLayout.NORTH);
            jContentPane.add(getJPanel1(), BorderLayout.SOUTH);
            jContentPane.add(getJPanel2(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    /**
     * This method initializes aboutDialog    
     *     
     * @return javax.swing.JDialog
     */
    private JDialog getAboutDialog() {
        if (aboutDialog == null) {
            aboutDialog = new JDialog(getJFrame(), true);
            aboutDialog.setTitle("About");
            aboutDialog.setSize(new Dimension(365, 132));
            aboutDialog.setContentPane(getAboutContentPane());
            aboutDialog.setResizable(false);
        }
        return aboutDialog;
    }

    /**
     * This method initializes aboutContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getAboutContentPane() {
        if (aboutContentPane == null) {
            aboutContentPane = new JPanel();
            aboutContentPane.setLayout(new BorderLayout());
            aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
            aboutContentPane.add(getJPanel6(), BorderLayout.SOUTH);
        }
        return aboutContentPane;
    }

    /**
     * This method initializes aboutVersionLabel    
     *     
     * @return javax.swing.JLabel    
     */
    private JLabel getAboutVersionLabel() {
        if (aboutVersionLabel == null) {
            aboutVersionLabel = new JLabel();
            aboutVersionLabel.setText("Binary Translator powered by Goran Pejovic");
            aboutVersionLabel.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);
        }
        return aboutVersionLabel;
    }

    /**
     * This method initializes jTextArea    
     *     
     * @return javax.swing.JTextArea    
     */
    private JTextArea getJTextArea() {
        if (jTextArea == null) {
            jTextArea = new JTextArea();
            jTextArea.setPreferredSize(new Dimension(400, 150));
            jTextArea.setLineWrap(true);
            jTextArea.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jTextArea.setWrapStyleWord(true);
//            jTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
//                public void keyTyped(java.awt.event.KeyEvent e) {
//                    if(e.paramString().contains("Enter")) { 
//                        jTextArea.setRows(enter++);
//                    }
//                }
//            });
        }
        return jTextArea;
    }

    /**
     * This method initializes jPanel    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new FlowLayout());
            jPanel.add(getJTextArea(), null);
            JScrollPane scrollPane = new JScrollPane(jTextArea);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setBorder(BorderFactory.createTitledBorder("Enter Text:"));
            scrollPane.setPreferredSize(new Dimension(400,150));
            jPanel.add(scrollPane);
        }
        return jPanel;
    }

    /**
     * This method initializes jPanel1    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel1() {
        if (jPanel1 == null) {
            jPanel1 = new JPanel();
            jPanel1.setLayout(new FlowLayout());
            jPanel1.setPreferredSize(new Dimension(410, 160));
//            jPanel1.add(getJTextArea1(), null);
            JScrollPane scrollingResult = new JScrollPane(getJTextArea1());
            scrollingResult.setBorder(BorderFactory.createTitledBorder("Binary:"));
            scrollingResult.setPreferredSize(new Dimension(400,150));
            jPanel1.add(scrollingResult);
        }
        return jPanel1;
    }

    /**
     * This method initializes jTextArea1    
     *     
     * @return javax.swing.JTextArea    
     */
    private JTextArea getJTextArea1() {
        if (jTextArea1 == null) {
            jTextArea1 = new JTextArea();
            jTextArea1.setPreferredSize(new Dimension(400, 150));
            jTextArea1.setBackground(Color.black);
            jTextArea1.setForeground(Color.green);
            jTextArea1.setBorder(BorderFactory.createBevelBorder(1));
            jTextArea1.setEditable(false);
            jTextArea1.setLineWrap(true);
            jTextArea1.setWrapStyleWord(true);
            jTextArea1.setFont(new Font("Monospaced", Font.PLAIN, 14));
        }
        return jTextArea1;
    }

    /**
     * This method initializes jPanel2    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(new BorderLayout());
            jPanel2.add(getJPanel3(), BorderLayout.SOUTH);
            jPanel2.add(getJPanel4(), BorderLayout.NORTH);
            jPanel2.add(getJPanel5(), BorderLayout.CENTER);
        }
        return jPanel2;
    }

    /**
     * This method initializes jButtonTrans    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButtonTrans() {
        if (jButtonTrans == null) {
            jButtonTrans = new JButton();
            jButtonTrans.setName("jButton");
            jButtonTrans.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButtonTrans.setText("Translate");
            jButtonTrans.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    Translate t = new Translate();
                    t.start();
                }
            });
        }
        return jButtonTrans;
    }

    /**
     * This method initializes jPanel3    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel3() {
        if (jPanel3 == null) {
            jPanel3 = new JPanel();
            jPanel3.setLayout(new FlowLayout());
            jPanel3.add(getJButtonTrans(), null);
            jPanel3.add(getJButtonClip(), null);
            jPanel3.add(getJButton(), null);
            jPanel3.add(getJButtonAbout(), null);
            jPanel3.add(getJButtonExit(), null);
        }
        return jPanel3;
    }

    /**
     * This method initializes jButtonClip    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButtonClip() {
        if (jButtonClip == null) {
            jButtonClip = new JButton();
            jButtonClip.setText("Copy");
            jButtonClip.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButtonClip.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    jTextArea1.selectAll();
                    jTextArea1.copy();
                }
            });
        }
        return jButtonClip;
    }

    /**
     * This method initializes jButtonAbout    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButtonAbout() {
        if (jButtonAbout == null) {
            jButtonAbout = new JButton();
            jButtonAbout.setText("About");
            jButtonAbout.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButtonAbout.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    JDialog aboutDialog = getAboutDialog();
                    aboutDialog.pack();
                    Point loc = getJFrame().getLocation();
                    loc.translate(20, 20);
                    aboutDialog.setLocation(loc);
                    aboutDialog.setVisible(true);
                }
            });
            
        }
        return jButtonAbout;
    }

    /**
     * This method initializes jButtonExit    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButtonExit() {
        if (jButtonExit == null) {
            jButtonExit = new JButton();
            jButtonExit.setText("Exit");
            jButtonExit.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButtonExit.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    System.exit(0);

                }
            });
        }
        return jButtonExit;
    }
    
    /**
     * This method initializes jButton    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButton() {
        if (jButton == null) {
            jButton = new JButton();
            jButton.setText("Clear");
            jButton.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    jTextArea1.setText("");
                }
            });
        }
        return jButton;
    }

    /**
     * This method initializes jPanel4    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel4() {
        if (jPanel4 == null) {
            GridBagConstraints gridBagConstraints = new GridBagConstraints();
            gridBagConstraints.gridx = 0;
            gridBagConstraints.gridy = 0;
            jPanel4 = new JPanel();
            jPanel4.setLayout(new FlowLayout());
            jPanel4.add(getJCheckBoxExtraZero(), null);
            jPanel4.add(getJCheckBoxLetters(), null);
            jPanel4.add(getJCheckBoxWords(), null);
        }
        return jPanel4;
    }

    /**
     * This method initializes jCheckBoxExtraZero    
     *     
     * @return javax.swing.JCheckBox    
     */
    private JCheckBox getJCheckBoxExtraZero() {
        if (jCheckBoxExtraZero == null) {
            jCheckBoxExtraZero = new JCheckBox();
            jCheckBoxExtraZero.setText("Remove leading zero");
            jCheckBoxExtraZero.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jCheckBoxExtraZero.addItemListener(new java.awt.event.ItemListener() {
                public void itemStateChanged(java.awt.event.ItemEvent e) {
                    if(e.getStateChange() == 1) { 
                        extrazero = false;
                    } else
                        extrazero = true;
                }
            });
        }
        return jCheckBoxExtraZero;
    }

    /**
     * This method initializes jCheckBoxLetters    
     *     
     * @return javax.swing.JCheckBox    
     */
    private JCheckBox getJCheckBoxLetters() {
        if (jCheckBoxLetters == null) {
            jCheckBoxLetters = new JCheckBox();
            jCheckBoxLetters.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jCheckBoxLetters.setText("Separated letters");
            jCheckBoxLetters.addItemListener(new java.awt.event.ItemListener() {
                public void itemStateChanged(java.awt.event.ItemEvent e) {
                    if(e.getStateChange() == 1) 
                        sepletters = true;
                    else
                        sepletters = false;
                }
            });
        }
        return jCheckBoxLetters;
    }

    /**
     * This method initializes jCheckBoxWords    
     *     
     * @return javax.swing.JCheckBox    
     */
    private JCheckBox getJCheckBoxWords() {
        if (jCheckBoxWords == null) {
            jCheckBoxWords = new JCheckBox();
            jCheckBoxWords.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jCheckBoxWords.setText("Separated words");
            jCheckBoxWords.addItemListener(new java.awt.event.ItemListener() {
                public void itemStateChanged(java.awt.event.ItemEvent e) {
                    if(e.getStateChange() == 1)
                        sepwords = true;
                    else 
                        sepwords = false;
                }
            });
        }
        return jCheckBoxWords;
    }

    /**
     * This method initializes jPanel5    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel5() {
        if (jPanel5 == null) {
            jLabel = new JLabel();
            jLabel.setText("[email protected]");
            jLabel.setForeground(Color.blue);
            jLabel.setFont(new Font("Times New Roman", Font.BOLD, 45));
//            jLabel.setIcon(new ImageIcon(getClass().getResource("/images.jpg")));
            jLabel.setHorizontalAlignment(SwingConstants.CENTER);
            jLabel.setPreferredSize(new Dimension(413, 71));
            jPanel5 = new JPanel();
            jPanel5.setLayout(new BorderLayout());
            jPanel5.add(jLabel, BorderLayout.NORTH);
        }
        return jPanel5;
    }    
    /**
     * This method initializes jPanel6    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel6() {
        if (jPanel6 == null) {
            jPanel6 = new JPanel();
            jPanel6.setLayout(new FlowLayout());
            jPanel6.add(getJButton2(), null);
        }
        return jPanel6;
    }

    /**
     * This method initializes jButton2    
     *     
     * @return javax.swing.JButton    
     */
    private JButton getJButton2() {
        if (jButton2 == null) {
            jButton2 = new JButton();
            jButton2.setText("Exit");
            jButton2.setFont(new Font("Lucida Grande", Font.PLAIN, 12));
            jButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    aboutDialog.setVisible(false);
                }
            });
        }
        return jButton2;
    }

    private class Translate extends Thread {
        
        public void run() { 
            if(!extrazero) { 
                if(sepletters) 
                    translateWithLetterSpaces();
                else if(sepwords)
                    translateWithWordSpaces();
                else
                    translateWithoutSpaces();
            }
            else
                translateWithZero();
        }
        
        public synchronized void translateWithLetterSpaces() { 
            StringBuffer sb = new StringBuffer(jTextArea.getText());
            String bin = "";
            
            for(int i = 0; i < sb.length(); i++) { 
                if(sb.charAt(i) == ' ') { 
                    bin = bin + " ";
                } else
                    bin = bin + Integer.toBinaryString(sb.charAt(i)) + " ";
            }
            jTextArea1.setText(bin);
        }
        
        public synchronized void translateWithWordSpaces() { 
            StringBuffer sb = new StringBuffer(jTextArea.getText());
            String bin = "";
            
            for(int i = 0; i < sb.length(); i++) { 
                if(sb.charAt(i) == ' ') { 
                    bin = bin + " ";
                } else
                    bin = bin + Integer.toBinaryString(sb.charAt(i));
            }
            jTextArea1.setText(bin);
        }
        
        public synchronized void translateWithoutSpaces() { 
            StringBuffer sb = new StringBuffer(jTextArea.getText());
            String bin = "";
            
            for(int i = 0; i < sb.length(); i++) { 
                    bin = bin + Integer.toBinaryString(sb.charAt(i));
            }
            jTextArea1.setText(bin);
        }
        
        public synchronized void translateWithZero() { 
            StringBuffer sb = new StringBuffer(jTextArea.getText());
            String bin = "";
            if(sepletters) { 
                for(int i = 0; i < sb.length(); i++) { 
                    bin = bin + "0" + Integer.toBinaryString(sb.charAt(i)) + " ";
                }
            } else if(sepwords) { 
                for(int i = 0; i < sb.length(); i++) { 
                if(sb.charAt(i) == ' ') { 
                    bin = bin + " ";
                } else
                    bin = bin + "0" + Integer.toBinaryString(sb.charAt(i));
                }
            }  else if(extrazero){
            
                for(int i = 0; i < sb.length(); i++) { 
                        bin = bin + "0" + Integer.toBinaryString(sb.charAt(i));
                }
            } 
            jTextArea1.setText(bin);
        }
        
    }
}


main klasa:
Code:
import javax.swing.SwingUtilities;

import gui.MainWindow;


public class Test {
    
    public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainWindow application = new MainWindow();
                application.getJFrame().setVisible(true);
            }
        });
    }

}

:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.ptt.rs.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc09.12.2008. u 14:27 - pre 187 meseci
Evo odgovora mada si malo morao da sačekaš ;)

Ovaj tvoj kod je totalni špageti kod. Molim te da se ne shvataš ovo kao kritiku, nego kao konstruktivne predloge ;)

import statements organizuj po packages - uvozi ceo package. Ako imaš neke
konflikte lako ćeš ih rešiti dodavanjem class na koju misliš u kodu. Ovako je
nepregledno.

nemoj da inicijalizuješ instance fields sa default vrednostima.
Code:
private JFrame jFrame = null; 

nemaš potrebe za tim. svako ko zna da pročita ovaj kod mora da zna koje su
default vrednosti za objects i primitives. Ovako samo dobijaš nepreglednost. U
moru inicijalizovana(koje ti JVM garantuje) izgubilo se inicijalizovanje
varijabli koje nisi hteo da imaju default vrednosti:
private boolean extrazero = true;
private int enter = 1;
Da si samo njih inicijalizovao iz cuga bih video da su njihove vrednosti
non-default.
Svugde konzistentno koristi camelCase:
sepletters - ni slučajno ovako nego sepLetters ;)
jCheckBoxextraZero - totalno nekonzistentno :(((

Užas živi kako imenuješ varijable. Je si li nekad čuo za meaningful naming. Pa
ne možeš sve zvati imenom klase. Šta meni ime varijable jButton govori o tome
šta taj JButton radi. Na primer exitButton, saveButton, closeButton su imena
koja automatski opisuju njihovu funkciju. Kada neko kod tebe vidi varijablu
mora da iskopa kod u kojem si je inicijalizovao da bi saznao o čemu se radi,
koja je njena funkcija. Ako tako budeš radio profesionalno onaj ko bude morao
da održava kod koji si napisao će te izmasakrirati ;) A kao prvo ni ti nećeš
moći da se snađeš ako posle par meseci pogledaš taj kod. Znači neka imena imaju
značenje sama po sebi. Ili kad ih jednom shvatiš, lako da se setiš šta je šta.
O tome postoji čitava nauka ;) Od ovakvok koda možeš samo da dobiješ glavobolju
;)

Koristi komentare. Ne treba da pišeš književna dela, ali ni ovo nije u redu.
Negde par reči učini čudo ;)

Kada vidiš ovako gigantsku klasu koja u sebi sadrži ceo program neka ti bude
jasno da nešto nije u redu. Java objektno orijentisani jezik. Pa, pobogu, nemoj
pisati proceduralno. Sve čekam gde će da mi izleti goto statement ;)
Svaka klasa ima svoju funkciju:
- korisnički interfejs(UI): brine da korisnik može da komunicira sa ostatkom
programa. UI je ono što korisnik vidi, UI prevodi zahteve korisnika ostatku
programa i vraća rezultate korisniku. Šta recimo da hoćeš da ovaj program
prilagodiš za rad u CLI-u iliti terminal iliti command_prompt(u win-u). Morao
bi da pišeš ceo program ispočetka. OOP treba da olakša reusability. Znači
UI bio tekstualni, grafički ili ko zna možda audio treba da bude odvojen od
logike aplikacije. Treba tako da napraviš program da na njega u svakom
momentu bez ikakvih izmena možeš da prikopčaš UI koji je trenutno potreban.
- ostatak programa: u njemu se sadrži sva logika za izvršavanje konkretnih
zadataka koji su suština programa. I treba da bude u posebnim klasama koje
takođe imaju svoju svrhu.

Zašto koristiš singleton pattern za inicijalizaciju svih elemenata programa??? I
to svi ti elementi su private! Singleton se koristi kada imaš neku klasu od koje
mora postojati samo jedna jedina instanca, bilo zbog problema koji mogu nastati
ako postoji više instanci, bilo zbog toga što je veoma skupo(u smislu
performance) praviti više takvih instanci.

Code:

/** Klasa koja predstavlja Windows System Registry. Recimo da bi nastale
  * nepopravljive greške kada bi postojalo više instanci ove klase i recimo
  * više njih pokušavalo da izmeni isti KEY u registry-ju. Stoga koristimo
  * Singleton Design Pattern da bi ograničili ovu klasu na jedinstvenu instancu.
  */
public class WindowsSystemRegistry{
    /* ova varijabla će sadržati jedinstvenu instancu klase */
    private WindowsSystemRegistry registry;
    
    /* privatni konstruktor - znači spolja ne može da se inicijalizuje */
    private WindowsSystemRegistry(){ // useful code 
    }
    
    /** Metod koji vraća jedinstvenu, unikatnu, jednu jedinu instancu ove
      * klase. Za multithreaded environment ovaj metod mora biti synchronized!!!
      * @return Unique instance of this class.
      */
    public WindowsSystemRegistry getWindowsSystemRegistry(){
        if(registry == null){
            registry = new WindowsSystemRegistry();
        }
        
        return registry;
    }
    
    // other useful code


Nemoj da daješ klasama ime koje je glagol - Translate, nego imenica - Translator.

JButton i JCheckBox imaju constructor koji prima String parametar.
Umesto:
Code:

JButton button = new JButton();
button.setText("Text");

koristi
Code:

JButton button = new JButton("Text");


umesto:
Code:

someComponent.add(otherComponent, null);

koristi:
Code:

someComponent.add(otherComponent);

to je jedno te isto s tim što gubiš zbunjujuće null.

Importuj java.awt.event da ne bi morao da pišeš:
Code:
java.awt.event.ActionListener



e da ne bi ispalo kako pričam svašta, refaktorisao sam tvoj kod pa probaj nešto da naučiš iz ovoga. I molim te bez ljutnje ;)

Ovo ide u MainWindow.java
Code:

package translator.gui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import translator.applogic.Translator;

/** 
  * Main window of GUI.
  */
public class MainWindow extends JFrame{


    private JPanel contentPanel;
    private JTextArea inputArea;
    private JPanel northPanel;
    private JPanel southPanel;
    private JTextArea outputArea;
    private JPanel centerPanel;
    private JButton translateButton;
    private JPanel buttonPanel;
    private JButton copyButton;
    private JButton aboutButton;
    private JButton exitButton;
    private JPanel checkPanel;
    private JCheckBox extraZeroCheck;
    private JCheckBox lettersCheck;
    private JCheckBox wordsCheck;
    private JPanel infoPanel;
    private JLabel emailLabel;
    private boolean extraZero = true;
    private boolean sepLetters;
    private boolean sepWords;
    private JButton clearButton;
    private int enter = 1;
    /* u DEFAULT_FONT varijabli držiš standardni font koji koristiš. Kad bi
     * promenio font da nemaš ovu varijablu: na koliko mesta bi morao da menjaš
     * kod. Ovo ti daje centralizovano mesto za tu promenu i to samo jednom!!!
     */
    private final Font DEFAULT_FONT;
    
    /**
     * This method initializes MainWindow.
     */
    public MainWindow() {
            /* initialize DEFAULT_FONT */
            DEFAULT_FONT = new Font("Lucida Grande", Font.PLAIN, 12);
            /* initialize MainWindow */
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setFont(DEFAULT_FONT);
            setSize(430, 516);
            setTitle("Binary Translator");
            setResizable(false);
            
            /* initialize main content panel */
            contentPanel = new JPanel(new BorderLayout());
            
            /* initialize northPanel */
            northPanel = new JPanel();
                        
            /* initialize inputArea and put it into inputScroll */
            inputArea = new JTextArea();
            inputArea.setPreferredSize(new Dimension(400, 150));
            inputArea.setLineWrap(true);
            inputArea.setFont(DEFAULT_FONT);
            inputArea.setWrapStyleWord(true);
            
            JScrollPane inputScroll = new JScrollPane(inputArea);
            inputScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            inputScroll.setBorder(BorderFactory.createTitledBorder("Enter Text:"));
            inputScroll.setPreferredSize(new Dimension(400,150));
            
            /* add component(s) to northPanel */
            northPanel.add(inputScroll);
                        
            /* initialize centerPanel */
            centerPanel = new JPanel(new BorderLayout());
            
            /* initialize buttonPanel */
            buttonPanel = new JPanel(new FlowLayout());
            
            /* initialize buttons for buttonPanel */
            translateButton = new TransButton("Translate", DEFAULT_FONT);
            translateButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    outputArea.setText(Translator.translate(inputArea.getText(),
                                       sepLetters, sepWords));
                    MainWindow.this.validate();
                }
            });
            
            copyButton = new TransButton("Copy", DEFAULT_FONT);
            copyButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    outputArea.selectAll();
                    outputArea.copy();
                }
            });
            
            clearButton = new TransButton("Clear", DEFAULT_FONT);
            clearButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    outputArea.setText("");
                }
            });
            
            aboutButton = new TransButton("About", DEFAULT_FONT);
            aboutButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JDialog aboutDialog = new AboutDialog();
                    Point loc = MainWindow.this.getLocation();
                    loc.translate(20, 20);
                    aboutDialog.setLocation(loc);
                    aboutDialog.setVisible(true);
                }
            });
            
            exitButton = new TransButton("Exit", DEFAULT_FONT);
            exitButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            
            /* dodaj buttons na buttonPanel */
            buttonPanel.add(translateButton);
            buttonPanel.add(copyButton);
            buttonPanel.add(clearButton);
            buttonPanel.add(aboutButton);
            buttonPanel.add(exitButton);
            
            /* initialize checkPanel */
            checkPanel = new JPanel(new FlowLayout());
            
            /* initialize check boxes */
            
            extraZeroCheck = new JCheckBox();
            extraZeroCheck.setText("Remove leading zero");
            extraZeroCheck.setFont(DEFAULT_FONT);
            extraZeroCheck.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if(e.getStateChange() == 1) { 
                        extraZero = false;
                    } else
                        extraZero = true;
                }
            });
            
            lettersCheck = new JCheckBox();
            lettersCheck.setFont(DEFAULT_FONT);
            lettersCheck.setText("Separated letters");
            lettersCheck.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if(e.getStateChange() == 1) 
                        sepLetters = true;
                    else
                        sepLetters = false;
                }
            });
            
            wordsCheck = new JCheckBox();
            wordsCheck.setFont(DEFAULT_FONT);
            wordsCheck.setText("Separated words");
            wordsCheck.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    if(e.getStateChange() == 1)
                        sepWords = true;
                    else 
                        sepWords = false;
                }
            });
            
            checkPanel.add(extraZeroCheck);
            checkPanel.add(lettersCheck);
            checkPanel.add(wordsCheck);
            
            /* initialize infoPanel */
            emailLabel = new JLabel();
            emailLabel.setText("[email protected]");
            emailLabel.setForeground(Color.blue);
            emailLabel.setFont(new Font("Times New Roman", Font.BOLD, 45));
            emailLabel.setHorizontalAlignment(SwingConstants.CENTER);
            emailLabel.setPreferredSize(new Dimension(413, 71));
            
            infoPanel = new JPanel(new BorderLayout());
            infoPanel.add(emailLabel, BorderLayout.NORTH);
            
            /* add components into centerPanel */
            centerPanel.add(checkPanel, BorderLayout.NORTH);
            centerPanel.add(infoPanel, BorderLayout.CENTER);
            centerPanel.add(buttonPanel, BorderLayout.SOUTH);
            
                        
            /* initialize southPanel */
            southPanel = new JPanel();
            southPanel.setLayout(new FlowLayout());
            
            /* initialize outputArea and put it into outputScroll */
            outputArea = new JTextArea();
            outputArea.setPreferredSize(new Dimension(400, 150));
            outputArea.setBackground(Color.black);
            outputArea.setForeground(Color.green);
            outputArea.setBorder(BorderFactory.createBevelBorder(1));
            outputArea.setEditable(false);
            outputArea.setLineWrap(true);
            outputArea.setWrapStyleWord(true);
            outputArea.setFont(new Font("Monospaced", Font.PLAIN, 14));
            
            JScrollPane outputScroll = new JScrollPane(outputArea);
            outputScroll.setBorder(BorderFactory.createTitledBorder("Binary:"));
            outputScroll.setPreferredSize(new Dimension(400,150));
            
            /* add components to southPanel */
            southPanel.add(outputScroll);
            
            /* add panels to contentPanel */
            contentPanel.add(northPanel, BorderLayout.NORTH);
            contentPanel.add(centerPanel, BorderLayout.CENTER);
            contentPanel.add(southPanel, BorderLayout.SOUTH);
            
            /* dodaj sve u contentPane ovog frame-a */
            Container contentPane = getContentPane();
            contentPane.add(contentPanel);
            
            SwingUtilities.updateComponentTreeUI(this);
    }
    
    /* jednostavna class-a da pojednostavi AboutDialog funkcionalnost */
    private class AboutDialog extends JDialog {
    
        public AboutDialog(){
            super(MainWindow.this);
            setModal(true);
            setTitle("About");
            setSize(new Dimension(365, 132));
            setResizable(false);
            setLayout(new BorderLayout());
            
            String text = "Binary Translator powered by Goran Pejović";
            JLabel versionLabel = new JLabel(text);
            versionLabel.setFont(DEFAULT_FONT);
            versionLabel.setHorizontalAlignment(SwingConstants.CENTER);
            
            TransButton exitButton = new TransButton("Exit", DEFAULT_FONT);
            exitButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    AboutDialog.this.setVisible(false);
                }
            }); 
            
            Container contentPane = getContentPane();
            contentPane.add(versionLabel, BorderLayout.CENTER);
            contentPane.add(exitButton, BorderLayout.SOUTH);
            
            pack();
        }
    }
}   


ovo ide u TransButton.java
Code:

package translator.gui;


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


/* Pošto je svaki tvoj button isti to jest ima iste karakteristike tipa font
 * itd napravićemo klasu koja će inicijalizovati tvoj karakterističan button.
 * Time izbegavamo da svaki put kada koristiš button ponavljaš code koji si već
 * napisao time eliminišemo ponavljanje koda i postižemo reuse.
 */
public class TransButton extends JButton{
    
    
    /** 
      *@param text Tekst koji će dugme prikazivati. 
      */
    public TransButton(String text, Font font){
        super(text);
        setFont(font);
    }
}


ovo ide u Translator.java
Code:

package translator.applogic;


/* Ovo mora da ide u posebnu klasu. Ne treba ti Thread funkcionalnost. I kad
 * hoćeš Thread funkcionalnost koristi Runnable interface, a ne Thread class.
 * A s obzirom da se ova klasa sastoji od čiste funcionalnosti možeš je napraviti
 * i kao statičnu klasu. Takođe svi metodi prate istu logiku i mogu se jednostavno
 * svesti na jedan metod. Ne dupliraj kod !!!!!
 */
 
/** 
  * Statična klasa koja sadrži funkcionalnost za prevođenje String inputa u
  * binary output.
  */
public class Translator {
    
    
    /* Čisto u slučaju da neko proba da napravi instancu */
    private Translator(){}


    /**
      * Prevodi <code>textToTranslate</code> i vraća ga u binary formatu 
      * @param textToTranslate String koji treba da se prevede.
      * @param withLetterSpaces Da li da ubacuje 
      */
    public static String translate(String textToTranslate, boolean separateLetters,
                                    boolean separateWords) { 
        StringBuffer sb = new StringBuffer(textToTranslate);
        String temp = "";        
        for(int i = 0; i < sb.length(); i++) { 
            if(separateLetters){
                if(sb.charAt(i) == ' ') { 
                    temp = temp + " ";
                } else {
                    temp = temp + Integer.toBinaryString(sb.charAt(i)) + " ";
                }
            } else if(separateWords){
                if(sb.charAt(i) == ' ') { 
                    temp = temp + " ";
                } else
                    temp = temp + Integer.toBinaryString(sb.charAt(i));
            }
        }
        return temp;
    }    
}


i na kraju izmenjaj Test.java ovako:
Code:

import javax.swing.SwingUtilities;

import translator.gui.*;


public class Test {
    
    public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainWindow application = new MainWindow();
                application.setVisible(true);
            }
        });
    }

}


Struktura direktorijuma:
Code:

src
|--------- Test.java
|
|---------gui
|         |
|         |---- MainWindow.java
|         |----- TransButton.java
|
|--------applogic
          |----- Translator.java

E sad to lepo prouči pa javi ako ti nešto nije jasno.

I moj i tvoj kod će isto raditi(s razlikom da moj nije kompletan jer sam zanemario neki deo funkcionalnosti) ali je razlika u pristupu. Nadam se da ćeš naučiti nešto iz ovoga i da će nekom poslužiti kao vodič.
Srdačni pozdrav,
Ivan Ivanić :D
Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc12.12.2008. u 16:54 - pre 187 meseci
Hvala na odgovoru. Ove kritike sam pozitivno shvatio i pokušaću da odsad organizujem kod kao što si mi rekao. GUI sam radio preko Eclipse-ovog plugina Visual Editor i on mi je napravio tu gomilu nepotrebnog koda (kojeg ću se rješiti u budućnosti :))
Ovo mi je inače prvi Swing projekat i ono, nisam obraćao pažnju na "sitnice", samo sam htio da mi program radi ono što sam zamislio, refaktorisanje i ostalo je lako uradit..
Imam dva pitanja u vezi ovoga tvog koda..
Code:
import java.awt.*;
import java.awt.event.*;

Zar mi se neće importovati event paket kad importujem cijeli java.avt.*?
Dalje, zašto je bolje da pravim Threadove preko Runnable interfejsa a ne nasleđujući Thread klasu?
Ja sam kontao da je to dobro jedino kad klasa nasleđuje neku drugu klasu, pa onda da koristim implementaciju Runnable interfejsa.
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Radovan__III
Radovan__III
Beograd

Član broj: 15669
Poruke: 1245
77.46.170.*



+26 Profil

icon Re: JScrollPane pomoc12.12.2008. u 17:03 - pre 187 meseci
Citat:
Astral Projection
Dalje, zašto je bolje da pravim Threadove preko Runnable interfejsa a ne nasleđujući Thread klasu?


Prvo mnogo je elegantnje resenje a drugo je ogranicenje jave tj da mozes da samo da imas jedanput nasledjivanje a interfejsa mozes imati kolko oces
Aj sad svi u biblioteku da nesto pojedemo i popijemo ...
--------------------------------
Knjigovodstvo

 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.ptt.yu.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc12.12.2008. u 17:38 - pre 187 meseci
Neće ti importovati ništa osim klasa u tom package-u. Statičke članove itd. ma kakvi. Znači kad importuješ:
Code:

java.awt.*; 

Uvezo si samo
java.awt.ImeKlase;

a ne

java.awt.ImeKlase;
java.awt.event.ImeKlase;
itd.

Ako ti nije jasno reci pa da pojasnimo.

Što se tiče tredova već si dobio odgovor. Uvek gledaj da koristiš interfejs kad možeš, jer ako nekad budeš morao, znači morao da koristiš nasleđivanje, šta ćeš ako nemaš tu mogućnost. A za funkcionalnost kao što su tredovi zaista je bizarno koristiti nasleđivanje u smislu subclassing-a.
Inače očito je da si koristio IDE da ti kreira GUI. Ali mislim da bi stvarno trebao da naučiš prvo ručno.
Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc12.12.2008. u 19:07 - pre 187 meseci
Evo preuredio sam kod kao što si mi ti preporučio:
MainWindow:
Code:
package gui;

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

import translator.Translator;

@SuppressWarnings("serial")
public class MainWindow extends JFrame {

    private JPanel jContentPane;
    private JPanel southPanel;
    private JPanel northPanel;
    private JTextArea binaryText;
    private JPanel centerPanel;
    private JButton translateButton;
    private JPanel buttonPanel;
    private JButton copyButton;
    private JButton aboutButton;
    private JButton exitButton;
    private JPanel checkboxPanel;
    private JCheckBox extraZeroCheck;
    private JCheckBox lettersCheck;
    private JCheckBox wordsCheck;
    private JPanel infoPanel;
    private JLabel emailLabel;
    private boolean extraZero = true;
    private boolean sepLetters = false;
    private boolean sepWords = false;
    private JButton clearButton;
    private JTextArea inputText;
    private final Font DEFAULT_FONT;

    /**
     * Inicijalizujemo MainWindow
     */

    public MainWindow() {
        /* Postavljamo DEFAULT_FONT varijablu */
        DEFAULT_FONT = new Font("Lucida Grande", Font.PLAIN, 12);
        /* Inicijalizujemo MainWindow */
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setFont(DEFAULT_FONT);
        setSize(430, 516);
        setResizable(false);
        setTitle("Binary Trancelator");

        /* Postavi sistemsku temu za default, umjesto Swing Metal */
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (UnsupportedLookAndFeelException ulfe) {
            ulfe.printStackTrace();
        } catch (IllegalAccessException iae) {
            iae.printStackTrace();
        } catch (InstantiationException ie) {
            ie.printStackTrace();
        } catch (ClassNotFoundException nce) {
            nce.printStackTrace();
        }

        /* Inicijalizujemo contentPane */
        jContentPane = new JPanel(new BorderLayout());

        /* Inicijalizujemo sjeverni panel */
        northPanel = new JPanel();

        /* Inicijalizujemo input text box i stavljamo ga u scrollpane */
        inputText = new JTextArea();
        inputText.setPreferredSize(new Dimension(400, 150));
        inputText.setLineWrap(true);
        inputText.setEditable(true);
        inputText.setFont(DEFAULT_FONT);
        inputText.setWrapStyleWord(true);

        JScrollPane inputScroll = new JScrollPane(inputText);
        inputScroll.setBorder(BorderFactory.createTitledBorder("Enter Text"));
        inputScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        inputScroll.setPreferredSize(new Dimension(400, 150));

        /* Dodavamo input text i scrollpane u sjeverni panel */
        northPanel.add(inputScroll);

        /* Inicijalizujemo centralni panel */
        centerPanel = new JPanel(new BorderLayout());

        /* Inicijalizujemo panel za dugmad */
        buttonPanel = new JPanel(new FlowLayout());

        /* Inicijalizujemo dugmad za panel */
        translateButton = new JButton("Translate");
        translateButton.setFont(DEFAULT_FONT);
        translateButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                binaryText.setText("");
                new Thread(new Translejtr()).start();
            }
        });

        copyButton = new JButton("Copy");
        copyButton.setFont(DEFAULT_FONT);
        copyButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                binaryText.selectAll();
                binaryText.copy();
            }
        });

        aboutButton = new JButton("About");
        aboutButton.setFont(DEFAULT_FONT);
        aboutButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JDialog aboutDialog = new AboutDialog();
                Point loc = MainWindow.this.getLocation();
                loc.translate(20, 20);
                aboutDialog.setLocation(loc);
                aboutDialog.setVisible(true);
            }
        });

        exitButton = new JButton("Exit");
        exitButton.setFont(DEFAULT_FONT);
        exitButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);

            }
        });

        clearButton = new JButton("Clear");
        clearButton.setFont(DEFAULT_FONT);
        clearButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                binaryText.setText("");
            }
        });

        /* dodaj dugmad u panele */
        buttonPanel.add(translateButton);
        buttonPanel.add(clearButton);
        buttonPanel.add(copyButton);
        buttonPanel.add(aboutButton);
        buttonPanel.add(exitButton);

        /* Inicijalizuj panel za checkboxe */
        checkboxPanel = new JPanel(new FlowLayout());

        /* Inicijalizuj checkboxe */
        extraZeroCheck = new JCheckBox("Remove leading zero");
        extraZeroCheck.setFont(DEFAULT_FONT);
        extraZeroCheck.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == 1) {
                    extraZero = false;
                } else
                    extraZero = true;
            }
        });

        lettersCheck = new JCheckBox("Separated letters");
        lettersCheck.setFont(DEFAULT_FONT);
        lettersCheck.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == 1)
                    sepLetters = true;
                else
                    sepLetters = false;
            }
        });

        wordsCheck = new JCheckBox("Separated words");
        wordsCheck.setFont(DEFAULT_FONT);
        wordsCheck.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == 1)
                    sepWords = true;
                else
                    sepWords = false;
            }
        });

        /* Dodavamo checkboxe u panel */
        checkboxPanel.add(extraZeroCheck);
        checkboxPanel.add(lettersCheck);
        checkboxPanel.add(wordsCheck);

        /* Inicijalizujemo info panel */
        emailLabel = new JLabel();
        emailLabel.setIcon(new ImageIcon(getClass().getResource("/gfx/grn1.png")));
        emailLabel.setHorizontalAlignment(SwingConstants.CENTER);
        emailLabel.setPreferredSize(new Dimension(413, 71));
        infoPanel = new JPanel(new BorderLayout());
        infoPanel.add(emailLabel, BorderLayout.NORTH);

        /* Dodavamo komponente u centralni panel */
        centerPanel.add(checkboxPanel, BorderLayout.NORTH);
        centerPanel.add(infoPanel, BorderLayout.CENTER);
        centerPanel.add(buttonPanel, BorderLayout.SOUTH);

        /* Inicijalizujemo juzni panel */
        southPanel = new JPanel(new FlowLayout());

        /* inicijalizujemo polje za binarni tekst */
        binaryText = new JTextArea();
        binaryText.setPreferredSize(new Dimension(400, 150));
        binaryText.setBackground(Color.black);
        binaryText.setForeground(Color.green);
        binaryText.setEditable(false);
        binaryText.setLineWrap(true);
        binaryText.setWrapStyleWord(true);
        binaryText.setFont(new Font("Monospaced", Font.PLAIN, 14));

        JScrollPane binaryScrollPane = new JScrollPane(binaryText);
        binaryScrollPane.setBorder(BorderFactory.createTitledBorder("Binary:"));
        binaryScrollPane.setFont(DEFAULT_FONT);
        binaryScrollPane.setPreferredSize(new Dimension(400, 150));
        binaryScrollPane.setAutoscrolls(true);

        southPanel.add(binaryScrollPane);

        /* Dodaj panele u glavni panel */
        jContentPane.add(northPanel, BorderLayout.NORTH);
        jContentPane.add(centerPanel, BorderLayout.CENTER);
        jContentPane.add(southPanel, BorderLayout.SOUTH);

        /* dodaj sve content pane ovog frejma */
        Container contentPane = getContentPane();
        contentPane.add(jContentPane);

        SwingUtilities.updateComponentTreeUI(this);

    }

    private class AboutDialog extends JDialog {

        public AboutDialog() {
            super(MainWindow.this);
            setModal(true);
            setTitle("About");
            setSize(new Dimension(365, 132));
            setResizable(false);
            setLayout(new BorderLayout());

            String text = "Binary Translator powered by Goran Pejovic";
            JLabel aboutVersionLabel = new JLabel(text);
            aboutVersionLabel.setFont(DEFAULT_FONT);
            aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);

            JButton aboutExitButton = new JButton("Exit");
            aboutExitButton.setFont(DEFAULT_FONT);
            aboutExitButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    AboutDialog.this.setVisible(false);
                }
            });

            Container contentPane = getContentPane();
            contentPane.add(aboutVersionLabel, BorderLayout.CENTER);
            contentPane.add(aboutExitButton, BorderLayout.SOUTH);

            pack();

        }

    }

    private class Translejtr implements Runnable {

        int textLoc = 0;
        boolean bulin = true;

        public void run() {
            translate();
        }
        
        public Translejtr() {}

        public void translate() {
            String translatedText = Translator.translate(inputText.getText(), sepLetters, sepWords, extraZero);
            while (bulin) {
                binaryText.append(translatedText.substring(textLoc,textLoc + 1));
                textLoc++;
                if (textLoc == translatedText.length()) 
                    bulin = false;
                try {
                    Thread.sleep(15);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


Translator:
Code:

package translator;

public class Translator {
    
    public Translator() {}

    public static String translate(String textToTranslate, boolean sepLetters,
            boolean sepWords, boolean extraZero) {
        StringBuffer sb = new StringBuffer(textToTranslate);
        String temp = "";

        for (int i = 0; i < sb.length(); i++) {
            if    (!extraZero) { 
                temp = temp + Integer.toBinaryString(sb.charAt(i));
            } else if (sepLetters) {
                temp = temp + "0" + Integer.toBinaryString(sb.charAt(i)) + " ";
            } else if (sepWords) {
                if (sb.charAt(i) == ' ') {
                    temp = temp + " ";
                } else
                    temp = temp + "0" + Integer.toBinaryString(sb.charAt(i));
            } else { 
                temp = temp + "0" + Integer.toBinaryString(sb.charAt(i));
            }
        }
        return temp;
    }
}


Test:
Code:
import javax.swing.SwingUtilities;

import gui.MainWindow;

public class Test {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainWindow application = new MainWindow();
                application.setVisible(true);
            }
        });
    }
}


Ovdje sam koristio thread da mi ispisuje bitove svakih 15 milisekundi (čisto stavio mali fenseraj, da testiram threadove). Morao sam ga napraviti unutar privatne klase jer u protivnom ne bih mogao da pristupim inputText-u (mogao sam da kreiram javni string i da dodijelim vijednost inputTexta tome stringu, ali mi je ovako lakše bilo :P)
Ne znam tripujem li, ali mi se čini da program brže radi. Prije kad stavim dosta texta da prevede, ispisivao je bitove užasno sporo (možda svakih 100ms). Sad ih ispisuje normalno koliko god texta da stavim (15ms).
Scrollpane i dalje ne radi..

Enivej, je li vaša preporuka da npr prvo nacrtam program u IDE-u pa da ga onda sredim da liči na gore navedeni kod, ili baš da sve radim od 0? I još me zanima, moram li stavljat layoute kad mi prozor nije resizable?
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
*.dynamic.sbb.rs.

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: JScrollPane pomoc12.12.2008. u 21:12 - pre 187 meseci
Imajuci u vidu da ucis javu onda svako treba da naucis swing sto znaci da trebas da pises od 0.
Da si to radio ne bi postavio pitanje za layout :)

Podrazumjevani layout je FlowLayout sto u principu znaci da ti treba neki drugi ako ces da taj gui bude "noramalan"....
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
*.dynamic.sbb.rs.

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: JScrollPane pomoc12.12.2008. u 21:38 - pre 187 meseci
Zaboravih da napisem...

Ova linija ti pravi problem:

Code:

inputText.setPreferredSize(new Dimension(400, 150));


Kada je uklonis bice ok, ali bi bilo dobro da disejblujes neke dugmice kada je pokrenut proces prevodjenja i kod je jos uvijek dosta nepregledan...
Kao sto su rekli listenere nema potrebe da dodajes ovako a imena promenjivih neka budu smislenije organizovana!
Recimo: btn_clear, btn_copy...
 
Odgovor na temu

Ivan Ivanic
Ivan Ivanic
Freelance, Anywhere
Fruška Gora

Član broj: 203038
Poruke: 179
*.ptt.yu.

Sajt: ivan.yggdrasillcode.com


Profil

icon Re: JScrollPane pomoc12.12.2008. u 23:11 - pre 187 meseci
Samo nemoj da pomešaš default layout za JFrame, JDialog i JApplet je BorderLayout, a za JPanel je FlowLayout.
E vidiš lepo je primetio čovek ja sam skroz zaboravio da si pitao zašto stalno imaš skrolbar ;)
I još nešto, kad se odlučiš za način na koji ćeš da imenuješ varijable i metode itd drži se toga konzistentno.
Ovaj kod je mnogo bolji, ali je daleko od savršenog. Ja sam ti istakao vodilje. Evo ti još nekih saveta.
Čuvaj se nesrazmerno velikih klasa i metoda. Ako su preveliki moguće je da rade stvari koje nisu njihova dužnost, a time kršiš OOP osnove.
Mislim da ti ne bi škodilo da malo bolje proučiš OOP.
Hajde mi napiši četiri stuba dobrog OOP dizajna?

I reci mi je li ti sad jasnije šta se dešava kad je ovako napisan kod?
Rad rad i samo rad :-D
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc13.12.2008. u 15:38 - pre 187 meseci
Radi scrollpane, hvala ;)

Loše sam formulisao pitanje. Htio sam da pitam da li je preporučljivo da koristim null layout (mislio sam da je to default) kad mi prozor nije resizable? U null layoutu mogu fino da nacrtam dugmad i komponente gdje hoću.

Sa ovako napisanim kodom mi je mnogo jasnije šta se u stvari dešava.
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
*.dynamic.sbb.rs.

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: JScrollPane pomoc13.12.2008. u 15:47 - pre 187 meseci
Nista i drugi put :D

Nije preporucljivo da koristis null layout jer to znaci da ces da koristis neki Visual Editor :)

Jeste citljivije al recimo ovo:

Code:

copyButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                binaryText.selectAll();
                binaryText.copy();
            }
        });


Je valjda citljivije ovako nekako:

Code:

//klasa implementisa ActionListener
copyButton.addActionListener(this);
//i onda samo jedna 
public void actionPerformed(ActionEvent e) {
//u kojoj implementiras sta treba da implementiras
}
 
Odgovor na temu

Astral Projection

Član broj: 36254
Poruke: 714



+4 Profil

icon Re: JScrollPane pomoc13.12.2008. u 15:58 - pre 187 meseci
Onda bih za 10 različitih ActionListenera od 10 različitih dugmadi morao praviti 10 klasa. Jel tako treba?
Pretpostavljam da isto važi i za ItemListener
:(){ :|:& };:
Peace, Love, Unity, Respect!
 
Odgovor na temu

Mister_rap
SE at Viacom

Član broj: 8822
Poruke: 2540
*.dynamic.sbb.rs.

Jabber: mister_rap@jabber.com


+21 Profil

icon Re: JScrollPane pomoc13.12.2008. u 16:04 - pre 187 meseci
Haha brate ova ti je za ES bisere :D

Naravno da ne, ActionListener je interfejs a recimo tvoja "Gui" klasa implementira taj interfjes!
Normalno dodas svim dugmicima listener kako sam gore rekao a onda u actionPerformed obradis dogadjaj koji se desio.

Tacno je da ces u toj metodi imati vise nekih if-ova elsova i sl... Jer moras da ispitas dal je korisnik kliknuo na copy,cut ili nesto trece...
 
Odgovor na temu

[es] :: Java :: JScrollPane pomoc

Strane: 1 2

[ Pregleda: 4414 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.