2010-06-15 5 views
3

J'ai essayé d'aligner à gauche les boutons contenus dans une boîte, sans succès.Java Box Class: Unsolvable: alignement des composants vers la gauche ou la droite

Ils s'alignent à gauche, mais pour une raison quelconque, ne bougez pas tout le chemin à gauche comme on pourrait l'imaginer.

Je joins le code ci-dessous. S'il vous plaît essayez de le compiler et de voir par vous-même. Ça me semble bizarre.

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

}

Répondre

2

Lisez la section de la Swing tutoriel sur How to Use Box Layout. Il explique (et a un exemple) comment fonctionne BoxLayout lorsque les composants ont des alignements différents.

La solution simple est d'ajouter:

centerGUI.setAlignmentX(LEFT_ALIGNMENT); 
+0

Cela a fonctionné. Cela semble un peu illogique, mais je vais lire le texte et voir pourquoi. – user323186

+1

En attendant, si quelqu'un souhaite empêcher les autres de lire tout le texte et pense pouvoir l'expliquer, veuillez ajouter un message. – user323186

0

Pourquoi ne pas essayer d'utiliser MiGLayout? Ils ont beaucoup de grandes démos en ligne avec le code source, y compris beaucoup d'exemples d'alignement différents.

+0

réponse idiote. C'est facile de changer le gestionnaire de disposition. – user323186

+0

MiGLayout * est * un gestionnaire de mise en page :-) Bien que vous ayez raison, il est très facile à utiliser – mikera

2

Je ne sais pas pourquoi les boutons sont alignés comme ils le sont, mais c'est probablement parce qu'ils essaient de s'aligner avec la boîte au-dessus (je suis sûr que quelqu'un de mieux dans Swing peut vous donner une meilleure réponse) . Un moyen pratique de déboguer les problèmes de mise en page consiste à mettre en évidence les composants avec des bordures colorées, par ex. dans votre code actuel:

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

Cependant, si j'avais ces exigences, j'utiliser un BorderLayout, par exemple ce code est vaguement basé sur le vôtre, je l'ai enlevé les bits inutiles, de se concentrer sur la partie de mise en page (vous devriez le faire en posant des questions, il permet aux autres de répondre à des questions plus facilement)

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

} 
+1

+1 pour l'excellente technique de débogage –

Questions connexes