java - 如何使用 Java Swing 制作 GUI

标签 java swing user-interface

所以我最近开始学习面向对象的编程,用 Java 做了最基本的事情,现在我想从控制台编写转变为实际的 GUI。

但我无法理解它是如何工作的,我阅读了 oracle 文档中的所有内容,但他们的示例不是那么清晰易懂,也用谷歌搜索但无法找到任何好的解释。这是我最后的选择。

这是我对程序 GUI 外观的想法: ![像这样][1]

我画得不是很好,但所有复选框都应该对齐。

如果有人可以向我提供很棒的代码解释,即使只是一些好的解释也会对我有很大帮助,我的问题是当我对齐 1 个东西时,其他东西会搞砸。

我当前的代码:

public class Zadatak2 extends JFrame{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here


        new Zadatak2();

    }


    public Zadatak2(){

        JPanel panel1 = new JPanel();
        setSize(500, 250);
        setLocationRelativeTo(null);
        add(panel1);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);




        BorderLayout border1 = new BorderLayout();
        panel1.setLayout(border1);


        JPanel panel2 = new JPanel();
        GridLayout grid1 = new GridLayout(3,2);

        panel2.setLayout(grid1);
        panel2.add(new JCheckBox("Bold"));
        panel2.add(new JCheckBox("Italic"));
        panel2.add(new JCheckBox("Underline"));


        panel1.add(panel2,BorderLayout.WEST);



        JPanel panel3 = new JPanel();
        GridLayout grid2 = new GridLayout(4,1);
        panel3.setLayout(grid2);
        panel3.add(new JCheckBox("Strikerthrough"));
        panel3.add(new JCheckBox("Teletype"));
        panel3.add(new JCheckBox("Emphasis"));
        panel3.add(new JCheckBox("Strong"));
        panel1.add(panel3,BorderLayout.CENTER);

        JPanel panel4 = new JPanel();
        BorderLayout border2 = new BorderLayout();
        panel4.setLayout(border2);

        panel4.add(new JButton("Apply"), BorderLayout.EAST);
        panel4.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 70));
        panel1.add(panel4,BorderLayout.SOUTH);

        JPanel panel5 = new JPanel();
        GridLayout grid3 = new GridLayout(2,1);
        panel5.setLayout(grid3);
        panel5.add(new JLabel("Sample text"));
        JTextArea ta = new JTextArea("Sample text");
        panel5.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 30));
        ta.setSize(200, 200);
        panel5.add(ta);
        panel1.add(panel5,BorderLayout.EAST);


        setVisible(true);
    }

}

感谢大家的帮助,终于把gui弄对了,现在我明白多了。

最佳答案

要在 GridLayout 中放置复选框,您不应为每一列定义一个面板。只需像这样定义和放置它们:

JPanel panel2 = new JPanel();
GridLayout grid1 = new GridLayout(4, 2);

panel2.setLayout(grid1);
panel2.add(new JCheckBox("Bold"));
panel2.add(new JCheckBox("Strikerthrough"));
panel2.add(new JCheckBox("Italic"));
panel2.add(new JCheckBox("Teletype"));
panel2.add(new JCheckBox("Underline"));
panel2.add(new JCheckBox("Emphasis"));
panel2.add(new JLabel(""));  // fill the empty cell with an empty label
panel2.add(new JCheckBox("Strong"));

但是,由于您有一个 TextArea,它应该与复选框对齐并跨越多行,我建议改用 GridBagLayout。它需要编写更多代码,但比 GridLayout 灵活得多。

一个例子:

 public Zadatak2() {

    JPanel panel1 = new JPanel();
    setSize(500, 250);
    setLocationRelativeTo(null);
    add(panel1);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);

    BorderLayout border1 = new BorderLayout();
    panel1.setLayout(border1);

    JPanel panel2 = new JPanel();
    GridBagLayout grid1 = new GridBagLayout();

    panel2.setLayout(grid1);
    panel2.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

    Insets insets = new Insets(2, 2, 2, 2);

    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Bold"), c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 0;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Strikerthrough"), c);

    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 1;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Italic"), c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 1;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Teletype"), c);

    c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 2;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Underline"), c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 2;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Emphasis"), c);

    c = new GridBagConstraints();
    c.gridx = 1;
    c.gridy = 3;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JCheckBox("Strong"), c);

    insets = new Insets(2, 40, 2, 2);
    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 0;
    c.insets = insets;
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JLabel("Sample text"), c);

    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 1;
    c.insets = insets;
    c.weightx = .5;
    c.fill = GridBagConstraints.BOTH;
    c.gridheight = 3;
    JTextArea ta = new JTextArea("Sample text", 4, 4);
    JScrollPane sp = new JScrollPane(ta);
    panel2.add(sp, c);

    c = new GridBagConstraints();
    c.gridx = 2;
    c.gridy = 5;
    c.insets = new Insets(40, 40, 2,2);
    c.anchor = GridBagConstraints.WEST;
    panel2.add(new JButton("Apply"), c);


    panel1.add(panel2, BorderLayout.CENTER);

    pack();

    setVisible(true);
}

结果:

Screenshot of UI using GridBagLayout

请参阅GridBagLayout TutorialJavaDoc了解此布局的所有选项。

关于java - 如何使用 Java Swing 制作 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271856/

相关文章:

java - 如何使用 Java 将灰度二维矩阵打印到 JPanel

java - 使用可运行的 jar 嵌入 MS Access 数据库

ios - 根据另一个 NSbutton 以编程方式设置 NSButton 属性

Java透明面板和面板上的自定义效果

html - 表格单元格的多色边框

java - GAE/J 该应用程序不存在 (app_id=u'application-id')

java - 如何在 REST 服务中进行分页?

java - 如何在非二叉树中查找特定节点?

java - Android - 迭代列表时的空对象引用

Java 日志文件创建多个副本