java - 需要 GUI 帮助

标签 java swing user-interface

对于按钮后退按钮删除,我将setBounds设置为<强>(130, 120, 195,30);和 (10, 190, 195,30); ,但它们仍然没有移动到底部。

这里出了什么问题?

enter image description here

public deleteAdmin(int num)
    {
        super("Delete Admin");
        setBounds(100, 200, 340, 229);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        panel.setBounds(35, 19, 242, 146);
        contentPane.add(panel);

        JButton button = new JButton("Back");
        button.setBounds(130, 120, 195,30);
        panel.add(button);

        JButton bckButton = new JButton("Delete");
        bckButton.setBounds(10, 190, 195,30);
        panel.add(bckButton);

        adminAPI admin = new adminAPI();
        List<String>allName = null;
        try {
            allName= admin.displayName();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //System.out.println(allName);
        Object [] o1=allName.toArray();
        JCheckBox[] checkBoxList = new JCheckBox[num];
        System.out.println(allName);
         //JLabel[] names = new JLabel[num];
        for(int i = 0; i < num; i++) {   
            checkBoxList[i] = new JCheckBox(""+o1[i]);
            System.out.println(o1[i]);
           contentPane.add(checkBoxList[i]);

        }


    }

最佳答案

快速简单且错误的答案是,您正在调用尝试将组件精确放置到使用布局管理器的容器中,这仅在组件使用 null 布局时才有效,但同样这不是一个好的解决方案,因为这会导致 GUI 僵化,很难增强、升级和调试。

您的主要问题是您首先尝试使用 setBounds(...) 。更好的是学习使用布局管理器并以智能方式使用它们来轻松有效地将组件放置在您想要的位置。通常您会想要嵌套 JPanel,每个 JPanel 使用自己的布局管理器来帮助放置好内容。


例如这个图形用户界面:

enter image description here

使用以下代码创建:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

@SuppressWarnings("serial")
public class DeleteAdmin2 extends JPanel {
    private List<JCheckBox> checkBoxes = new ArrayList<>();

    public DeleteAdmin2() {
        JPanel topPanel = new JPanel(new GridLayout(1, 0, 5, 5));
        topPanel.add(new JButton("Back"));
        topPanel.add(new JButton("Delete"));

        String[] texts = { "A1", "B1", "C1", "D1", "E1", "A2", "B2", "C2", "D2", "E2" };
        JPanel checkBoxPanel = new JPanel(new GridLayout(0, 5, 5, 5));
        for (String text : texts) {
            JCheckBox checkBox = new JCheckBox(text);
            checkBoxes.add(checkBox);
            checkBoxPanel.add(checkBox);
        }

        setLayout(new BorderLayout(5, 5));
        add(topPanel, BorderLayout.PAGE_START);
        add(checkBoxPanel, BorderLayout.CENTER);
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Delete Admin");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DeleteAdmin2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}

一些侧面建议:

  • 看起来您想要将信息列表传递到此类中以显示它并允许用户删除管理员。如果是这样,那么该类的构造函数参数应该是管理员列表,而不是 int。
  • 如果此类用于显示 JFrame,则让它显示 JDialog,因为该类旨在显示应用程序子窗口,在这种情况下,对话框窗口更合适。这还为您提供了以模式方式显示窗口的选项 - 这意味着您可以选择以用户必须在允许与主应用程序窗口交互之前处理窗口的方式显示窗口。<
  • 如果您的 GUI 类扩展或创建 JPanel,而不是 JFrame 等顶级窗口,您会发现更大的灵活性。
  • 如果您希望向此类提供可能删除的管理员列表,请考虑将它们显示在 JList 而不是 JCheckBox 集合中。 JList 将使您更容易知道谁被选中,并且它的模型可以保存实际的 Administrator 对象(如果您有这样的类)。
  • 学习并遵循 Java 命名约定——类名称应以大写字母开头,变量和方法名称应以小写字母开头。遵循这一点将使您的代码更易于阅读,如果您将来在这里提出问题,这将有助于那些试图帮助您的人。
  • 此外,请改进您的问题标题。标题应该简洁、信息丰富地告诉我们您的问题是什么,而这个:“需要 GUI 帮助” 没有告诉我们任何可以帮助我们理解问题所在的内容。相反,使用类似的内容:“JButtons 未正确放置在 GUI 中”或类似的内容。这样做将有助于吸引更多人关注您的问题,从而获得更快、更好的答案。

关于java - 需要 GUI 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957438/

相关文章:

java - 我可以在同一个实体类中定义实体监听器吗?

java - 如何使用 Java 8 流向列表中的项目字段添加值

java - 不断收到异常 java.lang.LinkageError : Failed to link org/springframework/transaction/interceptor/TransactionInterceptor

java - 使用鼠标监听器创建主菜单

Java 鼠标监听器不工作

android - RelativeLayout 中的填充问题

java - 构建允许在不同二进制文件之间共享模块的系统

Java - 如何使非字符串对象的 JComboBox 显示字符串名称?

java - 启用/禁用 JFreeChart 的绘制

java - 强制 JOptionPane 保持打开状态