我用两个按钮制作了一个小程序。我标记
按钮中的一个退出程序,第二个按钮导入文件。

当有人按下程序时,我实际上让他们俩都退出了程序
问题是按钮占据了所有窗口,为什么呢?

我尝试了GridBagConstraints来调整按钮的大小,但是没有运气,这是没有输入的完整类。

public class Window2  extends JFrame{
   private static final long serialVersionUID = 1L;

   public Window2(){

       super ("ALANAZ imagtor");
       setSize(600,400);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       JPanel pnl1 = new JPanel(new GridLayout());
       JPanel pnl2 = new JPanel();

       //button
       JButton butn1 = new JButton("EXIT");
       JButton butn2 =new JButton("IMPORT");

       butn1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            JOptionPane.showMessageDialog(null, "exiting ... bye...");
            System.exit(0);
        }
    });
       butn2.addActionListener(new ActionListener(){

           public void actionPerformed(ActionEvent ae){
               JOptionPane.showMessageDialog(null, "can't import now exiting");
               System.exit(0);
           }
       });

       GridBagConstraints gb1 = new GridBagConstraints();
       gb1.insets = new Insets(15,15,15,15);
       //Jlabel
       JLabel lbl1 = new JLabel("exit or import an image");
       pnl1.add(butn1);
       pnl1.add(butn2);

       pnl2.add(lbl1);
       add(pnl2, BorderLayout.SOUTH);
       add(pnl1, BorderLayout.CENTER);
}}

最佳答案

您正在滥用布局管理器。您的pnl1 JPanel使用GridLayout(没有任何行或列常量吗?!),如果仅向其中添加一个组件,它将占用整个JPanel。您的代码中似乎包含GridBagConstraints,但是没有GridBagLayout,这使我感到困惑。

解决方案是继续阅读并了解如何使用布局管理器。请查看教程链接:Laying Out Components Within a Container

关键是要记住,您可以在JPanels中嵌套JPanels。例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

import javax.swing.*;

public class Window2 extends JFrame {
   private static final long serialVersionUID = 1L;
   private static final int PREF_W = 600;
   private static final int PREF_H = 400;

   public Window2() {

      super("ALANAZ imagtor");
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      int gap = 3;
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, gap, 0));
      buttonPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
      JPanel pnl2 = new JPanel();

      JButton butn1 = new JButton("EXIT");
      JButton butn2 = new JButton("IMPORT");

      butn1.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "exiting ... bye...");
            System.exit(0);
         }
      });
      butn2.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent ae) {
            JOptionPane.showMessageDialog(null, "can't import now exiting");
            System.exit(0);
         }
      });

      JLabel lbl1 = new JLabel("exit or import an image");
      buttonPanel.add(butn1);
      buttonPanel.add(butn2);


      JPanel centerPanel = new JPanel(new BorderLayout());
      centerPanel.add(buttonPanel, BorderLayout.SOUTH);

      pnl2.add(lbl1);
      add(pnl2, BorderLayout.SOUTH);
      add(centerPanel, BorderLayout.CENTER);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public static void main(String[] args) {
      Window2 win2 = new Window2();
      win2.pack();
      win2.setLocationRelativeTo(null);
      win2.setVisible(true);
   }
}

10-07 19:28
查看更多