我如何将这些控件对齐到左边?

时间:2012-04-13 16:21:31

标签: java swing

这是它输出的内容:

This is what it outputs :

我想在最左边对齐'Imprimante:MonImprimante' 以及3个复选框。

通过使用ctrl-f

搜索***,您可以找到与我想要对齐的内容相关的代码

这是我的代码: `

package gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;

public class ImprimanteWindow extends JFrame{

   //Declares the panels used to place the controls.
private JPanel JPanelBtn;
private JPanel JPanelChk;
private JPanel JPanelRad;
private JPanel JPanelDrpChk;
private JPanel JPanelWrap;
private JPanel JPanelSuperWrap;
private String[] QltImpression = { "Haute", "Medium", "Bas"};

public ImprimanteWindow(){


    //Initialise the panels
    JPanelBtn = new JPanel(new GridLayout(4,1, 10, 10));
    JPanelChk = new JPanel(new GridLayout(3,1));
    JPanelRad = new JPanel(new GridLayout(3,1));
    JPanelDrpChk = new JPanel();
    JPanelWrap = new JPanel(); //used to put the other panels inside
    JPanelSuperWrap = new JPanel();  //used to put everything in 1 big panel

            //Initialise the buttons and add them to the button Panel
    JPanelBtn.add(new JButton("Ok"));
    JPanelBtn.add(new JButton("Annuler"));
    JPanelBtn.add(new JButton("Paramètre"));
    JPanelBtn.add(new JButton("Aide"));
    this.add("East", JPanelBtn);

            //***I want to align this to the far left 
            //adds the check boxes to the checkbox panel
    JPanelChk.add(new JCheckBox("Image"));
    JPanelChk.add(new JCheckBox("Texte"));
    JPanelChk.add(new JCheckBox("Code"));

            ////adds the radio buttons to the radiobutton panel
    JPanelRad.add(new JRadioButton("Selection"));
    JPanelRad.add(new JRadioButton("Tous"));
    JPanelRad.add(new JRadioButton("Applet"));

            //***I want to align this to the far left 
            //adds the label to the top section of the panel
    JPanelSuperWrap.add(new JLabel("Imprimante : MonImprimante"));

            //adds the 2 panels and the slider to the middle section
    JPanelWrap.add(JPanelChk);
    JPanelWrap.add(JPanelRad);
    JPanelWrap.add(new JSlider());
    JPanelSuperWrap.add(JPanelWrap);    

            //adds a label, a combobox and a checkbox to the bottom.
    JPanelDrpChk.add(new JLabel("Qualite de l'impression :"));
    JPanelDrpChk.add(new JComboBox(QltImpression));
    JPanelDrpChk.add(new JCheckBox("Imprimer dans un fichier"));
    JPanelSuperWrap.add(JPanelDrpChk);
    this.add(JPanelSuperWrap);

    this.pack();

    this.setSize(500,170);
    this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.validate();
}


public static void main(String args[]){
    ImprimanteWindow gui = new ImprimanteWindow();

}
}`

任何帮助将控件放在我的gui上都会有很大的帮助! 非常感谢你们!

3 个答案:

答案 0 :(得分:1)

使用具有硬设置布局的嵌套面板,然后使用不具有硬设置的包装器,会让您的生活更加艰难。如果您要在微观级别上进行明确控制并具有特定的显示要求(例如标签案例),则应在JPanelWrapJPanelSuperWrap中使用明确的布局。

此外,使用更好地传达您意图的布局。当GridLayout更好地表达您的意图时,为什么在嵌套组件中使用3x1 BoxLayout?您正在使用Swing等效的HTML嵌套<table>布局。您可以使内部面板使用带填充的框,因为它们是简单的列,并使用2x2 GridBagLayout用于JPanelSuperWrapJPanelBtn占用2行。

您可能还想要更好的名称而不是那些面板实际上是什么,并且您真的应该考虑将此View封装到从ImprimanteWindow实例化的子组件中。换句话说,取像JPanelBtn一样的片段并将其放入另一个语义定义分组的类中,如SelectionChoices,然后在该类上定义一个返回JPanel的方法。

答案 1 :(得分:0)

每次从这里添加JCheckBox,JLabel或JRadioButton(表示为j)时,请尝试调用j.setHorizontalTextAlignment(SwingConstants.LEFT);。我怀疑这可能不起作用,因为你使用GridLayout,这是一个相当不灵活的布局。

IHMO会更好,如果您在GridBagLayout中使用JPanels这些组件,并使用GridBagConstraints告诉布局如何在将这些组件添加到其中时对齐这些组件各自的小组。

答案 2 :(得分:0)

为此,您只需执行此操作

    JPanel scope = new JPanel();
scope.setBorder(BorderFactory.createTitledBorder("Scope"));
scope.setLayout(new BoxLayout(scope,BoxLayout.Y_AXIS));
scope.setAlignmentX(Component.LEFT_ALIGNMENT);