【问题标题】:How and where to draw JPanels如何以及在何处绘制 JPanel
【发布时间】:2019-04-29 16:49:24
【问题描述】:

我正在编写一个小应用程序,其中我想要一个将窗口分成两个部分的 gui,每个部分将由 JPanel 控制。我想在左侧添加一个输入字段和一组按钮。我有代码:

public ModalModeller() {
    super("Modal Modeller"); 
    //setLayout(new GridBagLayout());
    setSize(1000, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    font = new Font("Sans-serif", Font.PLAIN, 20);
    setUpTextInputField();
    setUpButtons();
    setUpPanels();
    setVisible(true);
}
public void setUpTextInputField() {
    inputField = new JTextField(30);
    inputField.addActionListener( // anonymous inner class
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String s = inputField.getText();
                    ExprStr inputExpression = new ExprStr(s);
                    System.out.println(s);
                }
            });
    //add(inputField);
}
public void setUpButtons() {
    buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridBagLayout());
    GridBagConstraints buttonConstraints = new GridBagConstraints();
    buttonConstraints.gridx = 0;
    buttonConstraints.gridy = GridBagConstraints.RELATIVE;
    buttonConstraints.anchor = GridBagConstraints.WEST;

    reflexB = new JRadioButton();
    reflexB.addActionListener(this);
    reflexB.setFont(font);

    transB = new JRadioButton();
    transB.addActionListener(this);
    transB.setFont(font);

    symmB = new JRadioButton();
    symmB.addActionListener(this);
    symmB.setFont(font);

    hereditaryB = new JRadioButton();
    hereditaryB.addActionListener(this);
    hereditaryB.setFont(font);

    buttonPanel.add(reflexB);
    buttonPanel.add(transB);
    buttonPanel.add(symmB);
    buttonPanel.add(hereditaryB);


}
public void setUpPanels() {
    leftPanel = new JPanel();
    rightPanel = new JPanel();
    leftPanel.setLayout(new GridBagLayout());
    rightPanel.setLayout(new GridBagLayout());

    leftPanel.setBackground(Color.black);


    GridBagConstraints leftConstraints = new GridBagConstraints();
    GridBagConstraints rightConstraints = new GridBagConstraints();

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 0;
    leftConstraints.gridy = 0;
    leftPanel.add(inputField, leftConstraints);

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 1;
    leftConstraints.gridy = 0;
    leftPanel.add(buttonPanel, leftConstraints);
    add(leftPanel);
    add(rightPanel);
}

我知道当我不在 JPanel 中绘制 inputTextField 时它可以工作,但由于某种原因,我的窗口中都没有绘制任何 JPanel。为什么是这样?我是否将它们添加到错误的位置?我选择的布局有问题吗?

谢谢:)

【问题讨论】:

  • 您考虑过使用JSplitPane吗?
  • 由于您将代码分解为组件,这很好,我会考虑将它们制作成自定义组件,这将简化您的代码并使其更易于维护
  • buttonPanel 是方法 setUpButtons() 的本地变量。由于您没有将该面板添加到任何内容,因此当该方法结束时,buttonPanel 及其所有内容都将被丢弃。

标签: java swing jpanel awt


【解决方案1】:

但由于某种原因,我的窗口中都没有绘制 JPanel

不知道为什么它们都没有显示,但我知道为什么左侧面板没有显示。

据我所知,您使用的是 JFrame。 JFrame 的默认布局管理器是 BorderLayout。您尝试使用以下方法将两个面板添加到框架中:

add(leftPanel);
add(rightPanel);

但是,当您将组件添加到 BorderLayout 并且未指定约束时,该组件将添加到 CENTER。但是,CENTER 中只能添加一个组件,因此 BorderLayout 只管理添加的最后一个组件。

我想要一个将窗口分成两部分的 gui

因此,我不会根据您正在创建的所有面板来构建代码,而是根据您要添加到框架中的面板来构建代码。

所以你的构造函数中的代码应该是这样的:

add(createLeftPane(), BorderLayout.LINE_START);
add(createCenterPanel(), BorderLayout.CENTER);

所以现在在高层次上,您知道您将两个主要面板添加到框架中。

那么代码可能是这样的:

private JPanel createLeftPanel()
{
    JPanel panel = new JPanel();
    panel.add( new JButton("Left Panel Button") );
    return panel;
}

您可以为createCenterPanel() 方法添加类似的代码。

然后,一旦您显示了两个顶级面板,您就可以使用您想要使用的任何布局管理器将您的真实组件添加到每个面板。

表单设计应该是一种迭代方法。

【讨论】:

    【解决方案2】:

    好吧,一连串的问题......

    JFrame默认使用BorderLayout,你似乎永远不会改变它,这意味着当你添加leftPanel然后rightPanel时,右边的面板是获胜并被显示。

    接下来,您在 rightPanel 上看不到任何内容的原因是因为您实际上并未向其中添加任何内容

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 0;
    leftConstraints.gridy = 0;
    leftPanel.add(inputField, leftConstraints);
    
    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 1;
    leftConstraints.gridy = 0;
    leftPanel.add(buttonPanel, leftConstraints);
    

    这两个块都将组件添加到leftPanel

    我认为你想要做的,在第二个区块中,更像是......

    rightConstraints.fill = GridBagConstraints.BOTH;
    rightConstraints.gridx = 1;
    rightConstraints.gridy = 0;
    rightPanel.add(buttonPanel, leftConstraints);
    

    一旦我纠正了所有这些问题,你的代码就可以工作了

    可运行示例...

    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    
    public class ModalModeller extends JFrame {
    
      public static void main(String[] args) {
        new ModalModeller();
      }
    
      private JTextField inputField;
      private JPanel buttonPanel;
      private JRadioButton reflexB;
      private JRadioButton transB;
      private JRadioButton symmB;
      private JRadioButton hereditaryB;
      private JPanel leftPanel;
      private JPanel rightPanel;
    
      public ModalModeller() {
        super("Modal Modeller");
        setLayout(new GridLayout(0, 2));
        setSize(1000, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUpTextInputField();
        setUpButtons();
        setUpPanels();
    
        setVisible(true);
      }
    
      public void setUpTextInputField() {
        inputField = new JTextField(30);
        inputField.addActionListener( // anonymous inner class
                new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            String s = inputField.getText();
    //      ExprStr inputExpression = new ExprStr(s);
            System.out.println(s);
          }
        });
        //add(inputField);
      }
    
      public void setUpButtons() {
        buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridBagLayout());
        GridBagConstraints buttonConstraints = new GridBagConstraints();
        buttonConstraints.gridx = 0;
        buttonConstraints.gridy = GridBagConstraints.RELATIVE;
        buttonConstraints.anchor = GridBagConstraints.WEST;
    
        reflexB = new JRadioButton();
    //  reflexB.addActionListener(this);
    
        transB = new JRadioButton();
    //  transB.addActionListener(this);
    
        symmB = new JRadioButton();
    //  symmB.addActionListener(this);
    
        hereditaryB = new JRadioButton();
    //  hereditaryB.addActionListener(this);
    
        buttonPanel.add(reflexB);
        buttonPanel.add(transB);
        buttonPanel.add(symmB);
        buttonPanel.add(hereditaryB);
    
      }
    
      public void setUpPanels() {
        leftPanel = new JPanel();
        rightPanel = new JPanel();
        leftPanel.setLayout(new GridBagLayout());
        rightPanel.setLayout(new GridBagLayout());
    
        leftPanel.setBackground(Color.black);
    
        GridBagConstraints leftConstraints = new GridBagConstraints();
        GridBagConstraints rightConstraints = new GridBagConstraints();
    
        leftConstraints.fill = GridBagConstraints.BOTH;
        leftConstraints.gridx = 0;
        leftConstraints.gridy = 0;
        leftPanel.add(inputField, leftConstraints);
    
        rightConstraints.fill = GridBagConstraints.BOTH;
        rightConstraints.gridx = 1;
        rightConstraints.gridy = 0;
        rightPanel.add(buttonPanel, leftConstraints);
        add(leftPanel);
        add(rightPanel);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多