JScrollPane没有出现?

时间:2010-10-10 21:35:12

标签: java swing hex jscrollpane

我的十六进制编辑器上有一些JScrollPanes,它们没有显示出来。 知道为什么吗?

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();
    }
}

2 个答案:

答案 0 :(得分:2)

您的滚动窗格在那里,但默认行为是仅在需要时显示滚动条。要强制它们显示,请进行以下更改:

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

由于BorderLayout的行为,您的滚动窗格非常窄。

答案 1 :(得分:0)

只有BorderLayout的CENTER才会被“填充”。您需要更改为另一个布局,如GridBagLayout,并使用weightx,weighty和fill来使它们更加可见或嵌套BorderLayouts。但他们在那里,你只是看不到它们,因为它们很小:)

我建议您查看GridBagLayout的教程