views:

49

answers:

2

I have some JScrollPanes on my hex editor and they're not showing up. Any idea why?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import java.util.Vector;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class HexEditor extends JFrame{
    JScrollPane hexScroll;
    JScrollPane byteScroll;
    JTextArea hexArea;
    JTextArea byteArea;
    JFileChooser chooser;// = new JFileChooser();
    FileInputStream fin;
    JMenuBar menuBar;
    JMenu file;
        JMenuItem load;

    public HexEditor(){
        super("Cypri's java hex editor");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setResizable(false);

        chooser = new JFileChooser();

        load = new JMenuItem("Load");
            load.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent event) {

                    try{

                        openFile();
                        fin = new FileInputStream(chooser.getSelectedFile());

                        int ch;
                        StringBuffer strContent = new StringBuffer("");

                        for(int i = 0; (ch = fin.read()) != -1; i++){
                            String s = Integer.toHexString(ch);

                            if(s.length() < 2)
                                s = "0" + Integer.toHexString(ch);

                            if(i < 10)
                                strContent.append(" " + s.toUpperCase());

                            else{
                                strContent.append(" " + s.toUpperCase() + "\n");
                                i = 0;
                            }
                        }

                        hexArea.setText(strContent.toString());

                        byte[] b = hexStringToByteArray(strContent.toString());
                        char[] chars = new char[b.length];
                        String byteText = "";
                        int newLine = 0;
                        for(int i = 0; i < b.length; i++){
                            chars[i] = (char) b[i];
                            byteText += chars[i];

                            newLine++;
                            if(newLine > 10){
                                byteText += "\n";
                                newLine = 0;
                            }
                        }

                        hexArea.setText(strContent.toString());
                        byteArea.setText(byteText);
                        packMe();

                        //textArea.setWrapStyleWord(true);
                        //textArea.setColumns(50);
                        //textArea.setRows(50);
                    }

                    catch(Exception e){
                        e.printStackTrace();
                    }
                }
            });

        file = new JMenu("File");
        file.add(load);

        menuBar = new JMenuBar();
        menuBar.add(file);

        hexArea = new JTextArea();
        byteArea = new JTextArea();

        hexScroll = new JScrollPane();
        byteScroll = new JScrollPane();

        hexScroll.add(hexArea);
        hexScroll.setSize(500, 480);
        byteScroll.add(byteArea);
        byteScroll.setSize(500, 480);

        setSize(640, 480);
        //getContentPane().setBackground(Color.);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(BorderLayout.NORTH, menuBar);
        getContentPane().add(BorderLayout.WEST, hexScroll);
        getContentPane().add(BorderLayout.EAST, byteScroll);
        pack();
        setVisible(true);
    }

    public static byte[] hexStringToByteArray(String s) {
        int len = s.length() -1;
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }


    public void openFile(){
        chooser.showOpenDialog(null);
    }

    public void packMe(){
        pack();
    }

    public static void main(String[] args){
        HexEditor app = new HexEditor();
    }
}
+1  A: 

Your scrollpanes are there, but the default behavior is to only show the scrollbars when needed. To force them to be shown, you make these changes:

hexScroll = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
byteScroll = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

Your scrollpanes are very narrow due to the behavior of your BorderLayout.

RD
A: 

Only the CENTER of a BorderLayout will be 'filled'. You need to either change to another layout like GridBagLayout and use weightx, weighty and fill to make them more visible or nest your BorderLayouts. But they are there, you just cannot see them as they are small :)

I'd recommend looking at a tutorial for GridBagLayout

willcodejavaforfood