Класс Java Box: неразрешимый: выравнивание компонентов слева или справа - PullRequest
3 голосов
/ 15 июня 2010

Я пытался выровнять по левому краю кнопки, содержащиеся в блоке по левому краю, но безуспешно.

Они выравнивают по левому краю, но по какой-то причине не сдвигаются полностью влево, как можно себе представить.

Я прилагаю код ниже.Пожалуйста, попробуйте скомпилировать его и убедитесь сами.Мне кажется странным.

Спасибо, Эрик

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

}

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

Не уверен, почему кнопки выровнены так, как они есть, но, вероятно, потому, что они пытаются выровнять поле над ним (я уверен, что кто-то лучше разбирающийся в Swing может дать вам лучший ответ на этот вопрос).Удобный способ отладки проблем компоновки - выделить компоненты цветными рамками, например, в текущем коде:

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

Однако, если бы у меня были эти требования, я бы использовал BorderLayout, например, этот код свободно основан на вашем, я удалил ненужные биты, чтобы сосредоточиться на части макета (вы должны делать это при задании вопросов, это позволяет другим легче отвечать на вопросы)

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

}
2 голосов
/ 15 июня 2010

Прочитайте раздел из учебника по Swing на Как использовать макет коробки .Он объясняет (и имеет пример), как BoxLayout работает, когда компоненты имеют разные выравнивания.

Простое решение заключается в добавлении:

centerGUI.setAlignmentX(LEFT_ALIGNMENT);
0 голосов
/ 15 июня 2010

Почему бы не попробовать MiGLayout ?

У них есть много отличных онлайн-демонстраций с исходным кодом, включая множество различных примеров выравнивания.

...