views:

163

answers:

3

I have been trying to left align buttons contained in a Box to the left, with no success.

They align left alright, but for some reason dont shift all the way left as one would imagine.

I attach the code below. Please try compiling it and see for yourself. Seems bizarre to me.

Thanks, Eric

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MainGUI extends Box implements ActionListener{
    //Create GUI Components
    Box centerGUI=new Box(BoxLayout.X_AXIS);
    Box bottomGUI=new Box(BoxLayout.X_AXIS);
    //centerGUI subcomponents
    JTextArea left=new JTextArea(), right=new JTextArea();
    JScrollPane leftScrollPane = new JScrollPane(left), rightScrollPane = new JScrollPane(right); 
    //bottomGUI subcomponents
    JButton encrypt=new JButton("Encrypt"), decrypt=new JButton("Decrypt"), close=new JButton("Close"), info=new JButton("Info");
    //Create Menubar components
    JMenuBar menubar=new JMenuBar();
    JMenu fileMenu=new JMenu("File");
    JMenuItem open=new JMenuItem("Open"), save=new JMenuItem("Save"), exit=new JMenuItem("Exit");
    int returnVal =0;

    public MainGUI(){
        super(BoxLayout.Y_AXIS);
        initCenterGUI();
        initBottomGUI();
        initFileMenu();
        add(centerGUI);
        add(bottomGUI);
        addActionListeners();
    }
    private void addActionListeners() {
        open.addActionListener(this); 
        save.addActionListener(this); 
        exit.addActionListener(this); 
        encrypt.addActionListener(this); 
        decrypt.addActionListener(this); 
        close.addActionListener(this); 
        info.addActionListener(this); 
    }
    private void initFileMenu() {
        fileMenu.add(open);
        fileMenu.add(save);
        fileMenu.add(exit);
        menubar.add(fileMenu);
    }
    public void initCenterGUI(){
        centerGUI.add(leftScrollPane);
        centerGUI.add(rightScrollPane);
    }
    public void initBottomGUI(){
        bottomGUI.setAlignmentX(LEFT_ALIGNMENT);
        //setBorder(BorderFactory.createLineBorder(Color.BLACK));
        bottomGUI.add(encrypt);
        bottomGUI.add(decrypt);
        bottomGUI.add(close);
        bottomGUI.add(info);
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // find source of the action
        Object source=arg0.getSource();
        //if action is of such a type do the corresponding action
        if(source==close){
             kill();
        }
        else if(source==open){
            //CHOOSE FILE
            File file1 =chooseFile();
            String input1=readToString(file1);
            System.out.println(input1);
            left.setText(input1);
        }
        else if(source==decrypt){
            //decrypt everything in Right Panel and output in left panel
            decrypt();
        }
        else if(source==encrypt){
            //encrypt everything in left panel and output in right panel
            encrypt();
        }
        else if(source==info){
            //show contents of info file in right panel
            doInfo();
        }
        else {
            System.out.println("Error");
            //throw new UnimplementedActionException();
        }
    }

    private void doInfo() {
        // TODO Auto-generated method stub
    }
    private void encrypt() {
        // TODO Auto-generated method stub
    }
    private void decrypt() {
        // TODO Auto-generated method stub
    }
    private String readToString(File file) {
        FileReader fr = null;
        try {
            fr = new FileReader(file);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        BufferedReader br=new BufferedReader(fr);

        String line = null;
        try {
            line = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String input="";
        while(line!=null){
            input=input+"\n"+line;
            try {
                line=br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return input;
    }
    private File chooseFile() {
        //Create a file chooser
    final JFileChooser fc = new JFileChooser();
    returnVal = fc.showOpenDialog(fc);
        return fc.getSelectedFile();
    }
    private void kill() {
        System.exit(0);
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       MainGUI test=new MainGUI();
       JFrame f=new JFrame("Tester");
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       f.setJMenuBar(test.menubar);
       f.setPreferredSize(new Dimension(600,400));
       //f.setUndecorated(true);
       f.add(test);
       f.pack();
       f.setVisible(true);
    }

}

+1  A: 

Why not try using MiGLayout?

They have a lot of great online demos with source code, including lots of different alignment examples.

mikera
Silly answer. Its easy just to change the layout manager.
MiGLayout *is* a layout manager :-) Though you are right it is very easy to use
mikera
+1  A: 

Not sure why the buttons are aligned the way they are, but it's probably because they are trying to align with the box above it (I'm sure someone better versed in Swing can give you a better answer to that one). A handy way to debug layout issues is to highlight the components with coloured borders, e.g. in your current code:

    centerGUI.setBorder(BorderFactory.createLineBorder(Color.GREEN));
    add(centerGUI);
    bottomGUI.setBorder(BorderFactory.createLineBorder(Color.RED));
    add(bottomGUI);

However, if I had those requirements, I'd use a BorderLayout, e.g. this code is loosely based on yours, I removed the unnecessary bits, to concentrate on the layout portion (you should do this when asking questions, it allows others to answer questions more easily)

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Tester {

    private JPanel contentPanel;
    private JTextArea leftTextArea = new JTextArea();
    private JTextArea rightTextArea = new JTextArea();
    private JMenuBar menuBar = new JMenuBar();

    public Tester() {
        initialisePanel();
        initFileMenu();
    }

    public JPanel getContent() {
        return contentPanel;
    }

    public JMenuBar getMenuBar() {
        return menuBar;
    }

    private final void initialisePanel() {
        contentPanel = new JPanel(new BorderLayout());

        Box centreBox = new Box(BoxLayout.X_AXIS);
        JScrollPane leftScrollPane = new JScrollPane(leftTextArea);
        JScrollPane rightScrollPane = new JScrollPane(rightTextArea);
        centreBox.add(leftScrollPane);
        centreBox.add(rightScrollPane);

        Box bottomBox = new Box(BoxLayout.X_AXIS);
        bottomBox.add(new JButton(new SaveAction()));
        bottomBox.add(new JButton(new ExitAction()));
        contentPanel.add(centreBox, BorderLayout.CENTER);
        contentPanel.add(bottomBox, BorderLayout.SOUTH);
    }

    private void initFileMenu() {
        JMenu fileMenu = new JMenu("File");
        fileMenu.add(new SaveAction());
        fileMenu.add(new ExitAction());
        menuBar.add(fileMenu);
    }

    class SaveAction extends AbstractAction {
        public SaveAction() {
            super("Save");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            handleSave();
        }
    }

    void handleSave() {
        System.out.println("Handle save");
    }

    class ExitAction extends AbstractAction {
        public ExitAction() {
            super("Exit");
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            handleExit();
        }
    }

    void handleExit() {
        System.out.println("Exit selected");
        System.exit(0);
    }

    public static void main(String[] args) {
        Tester test = new Tester();
        JFrame frame = new JFrame("Tester");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(test.getContent());
        frame.setJMenuBar(test.getMenuBar());
        frame.setPreferredSize(new Dimension(600, 400));
        frame.pack();
        frame.setVisible(true);
    }

}
Rulmeq
+1  A: 

Read the section from the Swing tutorial on How to Use Box Layout. It explains (and has an example) of how BoxLayout works when components have different alignments.

The simple solution is to add:

centerGUI.setAlignmentX(LEFT_ALIGNMENT);
camickr
This worked. Seems a bit unintuitive, but Im gonna read the text and see why.
In the meantime, if anyone wishes to save others from reading the whole text and thinks they can explain it, please add a post.